Рассмотрим:
// member data omitted for brevity
// assume that "setAngle" needs to be implemented separately
// in Label and Image, and that Button does need to inherit
// Label, rather than, say, contain one (etc)
struct Widget {
Widget& move(Point newPos) { pos = newPos; return *this; }
};
struct Label : Widget {
Label& setText(string const& newText) { text = newText; return *this; }
Label& setAngle(double newAngle) { angle = newAngle; return *this; }
};
struct Button : Label {
Button& setAngle(double newAngle) {
backgroundImage.setAngle(newAngle);
Label::setAngle(newAngle);
return *this;
}
};
int main() {
Button btn;
// oops: Widget::setText doesn't exist
btn.move(Point(0,0)).setText("Hey");
// oops: calling Label::setAngle rather than Button::setAngle
btn.setText("Boo").setAngle(.5);
}
Какие-нибудь методы, чтобы обойти эти проблемы?
Пример: использование магии шаблона для создания Button :: move return Button & или что-то в этом роде.
edit Стало ясно, что вторая проблема решается путем создания виртуального setAngle.
Но первая проблема остается неразрешенной разумным образом!
edit : Ну, я думаю, это невозможно сделать правильно в C ++. В любом случае, спасибо за усилия.