这是我想做的事。
说我有Class Widget。
然后我从Widget创建Button。
然后我创建了ModifiedWidget,它重新实现了Widget的某些功能。然后我希望Button使用ModifiedWidget而不是普通的Widget。这有可能做些怎么办?
由于
class Button : public Widget;
class SuperButton : public Button, public ModifiedWidget;
我只是不确定这是否能达到我想要的目的。
答案 0 :(得分:3)
最简单的方法是使用封装,而不是继承。
class Button
{
Button(Widget * w) { mywidget = w; }
Widget * mywidget;
};
另一种方法是让Button成为模板类。
template<class Parent>
class Button : Parent
{
};
Button<Widget> mybutton1;
Button<ModifiedWidget> mybutton2;
答案 1 :(得分:0)
如果我理解了您的问题,这是典型的Dreaded Diamond Problem
虽然我建议重新考虑你的设计,但是有可能会有一些关注,因为可以经常避免多重继承(这会带来更简单,更清洁的设计)。
还有Read C++ Faq关于Dreaded Diamond
在回复您的示例时,您必须对Button和ModifiedWidget类使用虚拟继承。
class Button : public virtual Widget;
class ModifiedWidget : public virtual Widget;
答案 2 :(得分:0)
将它们分开:
class Widget {
...
virtual void some_function();
};
class ModifiedWidget : public Widget {
...
// override the base version of this method
virtual void some_function();
};
class Button {
Button(Widget* w) : widge(w) { }
Widget* widge;
};
class SuperButton : public virtual Button {
SuperButton(Widget* w) : Button(w) { }
};
现在您的Widget
有一个层次结构,而您的Button
有自己的层次结构。并且说你的Button 包含一个Widget可能更有意义,而不是说你的Button 是一个Widget。因此,对于Button-Widget关系,我们使用封装而不是继承,但仍然分别为Buttons和Widgets继承。