2012-11-26 2 views
2

나는 다음과 같은 코드가 있습니다다중 상속 분쟁

class Interface 
{ 
    virtual void method()=0; 
}; 

class Base : public Interface 
{ 
    virtual void method() 
    { 
    //implementation here 
    } 
}; 

class Parent: public Interface 
{ 

}; 

class Child : public Base, public Parent 
{ 

}; 

int main() 
{ 
    Child c;//ERROR: cannot instantiate abstract class 
} 

지금 내가 왜 이런 일을 알고 난 부모를 상속하고있어 이후 나는 다시 방법을 구현해야합니다. 하지만 이미 Base 클래스에 정의되어 있으며 모든 하위 클래스에 대해 해당 정의를 재정의하고 싶지 않습니다. 나는 C++에서 이것을 없애기위한 표준 방법이 있다고 생각한다. (인터페이스의 어떤 복사본을 사용해야하는지 컴파일러에게 알려준다.) 나는 그것이 무엇인지 기억하지 못한다.

+1

가상 상속이 없으면 여기에 'Child'클래스에 두 개의 별개의 가상'method()'함수가 생기지 않습니까? – NPE

+0

나는 그렇게 믿고있다. – atoMerz

+0

왜 'Base'와 'Parent'둘 다에서 상속을 원합니까? –

답변

1

당신은 다이아몬드 모양의 계층 구조를 가지고 있지만 가상 상속을 사용하고 있지 않습니다.

따라서 Child 클래스에는 두 개의 별개의 가상 method() 함수가 있습니다.

문제를 해결하는 한 가지 방법은 가상 상속을 사용하는 것입니다. 이 방법을 사용하면 Child::method() 하나만 사용할 수 있으며 두 가지 구현이 필요하지 않습니다.

+1

"다이아몬드 모양의 계층 구조이지만 가상 상속을 사용하지 않습니다." 즉, 코드는 ** 다이아몬드 모양의 계층 구조를 가지고 있지 않습니다 **. 인터페이스의 경우 솔루션은 인터페이스 클래스에서 가상으로 파생 시켜서 계층을 다이아몬드로 변환하는 것입니다. –

+0

@PeteBecker'인터페이스 클래스에서 사실상 파생 시켜서 계층 구조를 다이아몬드로 변환합니다.'멋지게 말하면, 나는 그런 식으로 생각하지 않았습니다 : P – atoMerz

4

당신이 말하는 것은 dominance입니다. 링크 된 기사에서

:

class Parent 
{ 
public: 
    virtual void function(); 
}; 

class Child1 : public virtual Parent 
{ 
public: 
    void function(); 
}; 

class Child2 : public virtual Parent 
{ 
}; 

class Grandchild : public Child1, public Child2 
{ 
public: 
    Grandchild() 
    { 
     function(); 
    } 
}; 
+0

+1 링크입니다. 매우 중요한 개념입니다! – juanchopanza