The documentation shows, which functions are `virtual`. C++ is relatively limited in comparison to other languages. In Java, everything is virtual, and Lua goes even further, for example.
You can of course still call all non-private methods. So, to achieve overriding draw(x, y, w, h), you override draw() instead and get the coordinates using Fl_Widget::x(), y(), w(), and h().
The original Dial code does just that:
void Fl_Dial::draw() {
draw(x(), y(), w(), h());
draw_label();
}