2011-02-11 4 views
0

다음은 내가하고 싶은 것입니다.다중 상속을 통해이 작업을 수행 할 수 있습니까?

나는 클래스 위젯을 가지고있다.

위젯에서 버튼을 만듭니다.

그런 다음 위젯의 특정 기능을 다시 구현하는 ModifiedWidget을 만듭니다.

그런 다음 일반 위젯 대신 ModifiedWidget을 사용하길 원합니다. 가능한 방법이 있습니까? 그게 내가 그 생각에하고 싶은 일을한다면

감사

class Button : public Widget; 

class SuperButton : public Button, public ModifiedWidget; 

난 그냥 확실하지 않다.

+0

잘 형성되지 않은 질문입니다. 작성된대로 부모 단추가 파생되는 것처럼 바꾼 것처럼 들립니다. –

+0

명확히하십시오. 이건'class widget {...}의 경우가 아닌가? ModifiedWidget 클래스 : public 위젯 {...}; Button 클래스 : public ModifiedWidget {...};'? –

+0

@Xadde 거의 yea – jmasterx

답변

3

가장 쉬운 방법은 상속이 아니라 캡슐화를 사용하는 것입니다.

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

또 다른 방법은 Button을 템플릿 클래스로 만드는 것입니다. 내가 당신의 디자인을 재검토 제안하지만 다중 상속은 종종 피할 수 있기 때문에

나는 당신의 질문을 이해 한 경우
template<class Parent> 
class Button : Parent 
{ 
}; 

Button<Widget> mybutton1; 
Button<ModifiedWidget> mybutton2; 
+2

캡슐화는 Liskov 원리를 잘 반사하지 못합니다. Button **은 위젯이며 Button 사용자는 위젯으로 사용하고자합니다. 템플릿 버전은 위젯을 믹스로 사용하여이 문제를 해결합니다. –

+0

@Andy T, is-a 관계는 너무 쉽게 생각할 수 있으며, 종종 너무 많은 문제없이 변경 될 수 있습니다. 이 사건에 대한 확신이 없기 때문에 나는 2 대 1 답변을주었습니다. –

+0

버튼과 슈퍼 버튼의 구현이 다를 수 있습니다. 그래서 그는 Button 을 확장해야 할 수도 있습니다. 그렇다면 우리는 무엇을 얻게됩니까? 템플릿 방식은 다중 상속보다 복잡합니다. – doc

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에 대한 상속 기능은 별도로 제공됩니다.

관련 문제