2012-04-14 2 views
1

나는 다음과 같은 시나리오에서 무슨 일이 일어날 지 알아낼 수 없습니다 : 여기C++ 다중 상속

class MBase { 
    public: 
     MBase(int) {} 
     virtual char* vf() const = 0; 
     virtual ~MBase() {} 
}; 

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

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

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

Base* b = new Bottom(); 
D1과 D2 모두 MBase에서 실질적으로 상속 된 다이아몬드의 원래 정의에서

, 그러나 단 하나입니다. 우리는 여전히 Bottom 객체에 두 개의 개별 하위 객체가있을 것이므로 컴파일러는 사용할 하위 객체를 알지 못하므로 마지막 행이 컴파일되지 않습니까?

+1

* 시도해 보셨습니까? –

답변

2

이것은 C++ 03 표준의 10.1.4 절에 지정되어 있습니다. 가상 및 비 가상베이스는 독립적이므로 각각 하나씩 존재합니다.

class MBase { 
    public: 
     MBase(int arg) { cerr << "MBase::MBase(" << arg << ")\n"; } 
     virtual const char* vf() const = 0; 
     virtual ~MBase() {} 
}; 

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

class D2 : virtual public MBase { 
    public: 
     D2() 
     : MBase(2) // This doesn't get used in this example because 
        // it is the responsibility of the most-derived 
        // class to initialize a virtual base, and D2 isn't 
        // the most-derived class in this example. 
     { 
     } 
     const char* vf() const { return "D2"; } 
}; 

class Bottom : public D1, public D2 { 
    public: 
    Bottom() 
    : MBase(5) // D1 and D2 default constructors are called implicitly. 
    { 
    } 
    const char* vf() const { return "Bottom"; } 
}; 

int main(int argc,char **argv) 
{ 
    Bottom b; 
    return 0; 
} 

출력 :

그것은 당신의 예를 확장하여이를 쉽게 알 수있다 나는 문제는 이것과 같은 당신을 생각

MBase::MBase(5) 
MBase::MBase(1) 
+0

D2의 생성자가 호출되지 않는 이유는 무엇입니까? – Bober02

+0

@ Bober02 : D2 생성자가 호출되지만 D2는 가상 기본 생성자를 호출하지 않습니다. 내 대답에 몇 가지 설명을 추가했습니다. –

1

을 ... 기본적으로, 각각의 오브제는 자신이있다 mBase 클래스의 기본 오브젝트 ...

Diamond inheritance

레가 rds, Erwald