考虑:
// 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 返回 Button& 或其他东西。
编辑很明显,第二个问题是通过将 setAngle 设为虚拟来解决的。
但是第一个问题仍未以合理的方式解决!
编辑:嗯,我想在 C++ 中做正确是不可能的。无论如何感谢您的努力。