2012-04-14 4 views
0

:다중 상속 - 일반적인 다이아몬드 시나리오에서 가상 수정

내가 하단의 상속 수정 D1과 D2 모두 가상 될를 수정 한 경우 변경 될지
class MBase { 
    public: 
    MBase(int) {} 
    virtual char const* vf() const = 0; 
    virtual ~MBase() {} 
}; 

class D1 : public MBase { //NOT VIRTUAL!!! 
    public: 
    D1() : MBase(1) {} 
    char const* vf() const { return "D1"; } 
}; 

class D2 : virtual public MBase { 
    public: 
    D2() : MBase(2) {} 
    char const* vf() const { return "D2"; } 
}; 

class Bottom : public D1, public D2 { 
    public: 
    char const* vf() const { return "Bottom"; } 
} 

? 즉, 영향을 미칩니다.

class Bottom : public virtual D1, public virtual D2 { 
    public: 
    char const* vf() const { return "Bottom"; } 
} 

답변

3

아니요. 각 클래스는 직접 기본 클래스 중 다른 클래스와 공유 할 수있는 클래스를 선택합니다. Bottom은 구현의 리프이고 두 경우 모두 D1D2의 인스턴스가 하나뿐이므로 둘 다 이러한 유형의 중첩 된 객체를 정확히 하나씩 포함합니다. D1MBase을 공유하기를 거부하므로 Bottom에는 두 개의 MBase 개체가 중첩됩니다.

그러나 MBase은 모호하기 때문에 Bottom의 두 버전에서 직접에 액세스 할 수 없습니다. MBase에서 Bottom 개체까지 액세스하려면 정확히 D1 또는 D2으로 캐스팅해야합니다 (정확하게 두 개의 MBase이 있기 때문입니다). 당신이하지 않는 한 사실상 MBase에서 상속 D1 하나가 있다면


의 차이는있을 것이다.

+0

좋아요, 그렇다면 제가 D1과 D2에서 사실 상속받은 커플 Bottoms를 가졌을 것입니다. 그런 다음 리프에 D1과 D2가 모두 하나만 포함될 것입니다 ... 완벽한 답변을 해주셔서 대단히 감사합니다! – Bober02