10

다음 코드는 여전히 가상 상속의 부재로 인해 부정적인 영향을 받습니까?기본 클래스에 데이터 멤버가 포함되어 있지 않은 경우에도 가상 상속이 필요합니까?

이 경우 부정적인 영향이와 같은 것 (또는 나쁜) class A이 데이터 멤버를 포함 않은 경우 가상 상속없이 다중 상속의 부정적인 영향?

class A 
{ 
public : 
    virtual ~A () { } 
    virtual int foo () const = 0 ; 
} ; 

class B : public A 
{ 
public : 
    virtual ~B () { } 
} ; 

class C : public A 
{ 
public : 
    virtual ~C () { } 
} ; 

class D : public B , public C 
{ 
public : 
    virtual int foo () const { return 12 ; } 
} ; 
+1

그것은 [보이는 잘 컴파일 여기에서] (http://coliru.stacked-crooked.com/view?id=8bd2970b897e9b44), 즉 B에서 파생 된 A에 대한 포인터가 C에서 파생 된 것과 같은 값을 가질 것으로 예상되는 경우입니다. – Niall

+1

By A에서 비어있는 구현을 가진 가상 소멸자를 선언해야합니다. http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors – Notinlist

+0

@Notinlist 캐치를 가져 주셔서 감사합니다. 안전을 위해 A, B, C에 가상 소멸자를 추가했습니다. – Giffyguy

답변

4

받는 상속 경로가 있기 때문에 당신이, 당신이 이런 일을 할 수 없을 것 상속이 가상하지 않는 경우, 일반적인 인터페이스로 A를 사용하려는 가정 아이 D에서 기본 클래스 A :

int main() 
{ 
    D d; 
    const A& a = d; 

    std::cout << a.foo() << " " << d.foo() << " " << std::endl; 
} 

당신은 다음 AD (A) 왜 추상 첫번째 장소에있는베이스와 (B)로해야합니까 없음을 사용할 필요가없는 경우 상속을 가상으로 할 필요가 없습니다. 중간 클래스에 가상 상속을 사용

1
class B : public virtual A { } ; 
class C : public virtual A { } ; 

, 당신의 클래스 D는 클래스 A의 단일 인스턴스를해야합니다, 당신의 코드는`볼 virtual` 필요처럼