Рассмотрим:
// 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);
}
Любые методы решения этих проблем?
Пример: использование магии шаблона для создания кнопки:: move return Button & или что-то в этом роде.
edit. Стало ясно, что вторая проблема решена путем создания виртуального приложения setAngle.
Но первая проблема остается нерешенной разумным образом!
изменить. Ну, я думаю, это невозможно сделать правильно на С++. Спасибо за все усилия.