2011-02-11 53 views
0

這是我想要做的。這可以通過多重繼承完成嗎?

說我有班小工具。

然後我從窗口小部件創建Button。

然後我創建了ModifiedWidget,它重新實現了Widget的某些功能。

然後我希望Button使用ModifiedWidget而不是普通的Widget。這有可能做一些如何?

感謝

class Button : public Widget; 

class SuperButton : public Button, public ModifiedWidget; 

我只是不知道這會做什麼,我希望它雖然。

+0

不是很好的問題。正如它所寫,聽起來好像你只是改變哪個父按鈕派生自。 – 2011-02-11 23:15:57

+0

請澄清。這不僅僅是`class Widget {...}; class ModifiedWidget:public Widget {...};類Button:public ModifiedWidget {...};`? – 2011-02-11 23:16:26

回答

3

最簡單的方法是使用封裝而不是繼承。

class Button 
{ 
    Button(Widget * w) { mywidget = w; } 
    Widget * mywidget; 
}; 

另一種方法是讓Button成爲模板類。

template<class Parent> 
class Button : Parent 
{ 
}; 

Button<Widget> mybutton1; 
Button<ModifiedWidget> mybutton2; 
0

如果我明白你的問題,這是典型的Dreaded Diamond Problem

有了一定的照顧,這是可能的,但我建議重新考慮你的設計,因爲多重繼承經常可以迴避(這帶來了更簡單和更清潔設計)。

上可怕的鑽石

而且Read C++ Faq在回答你的榜樣,你將不得不使用虛擬繼承了巴頓和ModifiedWidget類。

class Button : public virtual Widget; 

class ModifiedWidget : public virtual Widget; 
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繼承。