这可以通过多重继承来完成吗?

时间:2011-02-11 23:12:51

标签: c++ multiple-inheritance

这是我想做的事。

说我有Class Widget。

然后我从Widget创建Button。

然后我创建了ModifiedWidget,它重新实现了Widget的某些功能。

然后我希望Button使用ModifiedWidget而不是普通的Widget。这有可能做些怎么办?

由于

class Button : public Widget;

class SuperButton : public Button, public ModifiedWidget;

我只是不确定这是否能达到我想要的目的。

3 个答案:

答案 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继承。