2012-04-11 4 views
0

다음 클래스에서는 클래스 B와 클래스 C에 상속 된 클래스 A가 있습니다. 클래스 D는 B와 C에서 상속받습니다. 또한 D의 생성자는 B, C 및 A의 생성자를 호출합니다 B와 C가 A를 가상으로 상속 할 때 A 세대의 생성자를 직접 호출 할 수 없으므로 (3 세대를 통해 동일한 호출을해야하기 때문에).C++ 다중 상속 생성자

제가 B 클래스의 객체를 만들고 싶다면 A가 사실상 상속되기 때문에 어쨌든 A의 생성자 (v1과 v2를 전달하기 위해 초기화에 사용될 변수)를 호출 할 수 있습니까?

class A { 
    int a1,a2; 
    A() { 
    } 

    A(int v1,v2) { 
     a1 = v1; 
     a2 = v2; 
    } 
}; 

class B:virtual public A { 
    int b1,b2; 
    B() { 
    } 

    B(int v1,v2) { 
     b1 = v1; 
     b2 = v2; 
    } 
}; 

class C:virtual public A { 
    int c1,c2; 
    C() { 
    } 

    C(int v1,v2) { 
     c1 = v1; 
     c2 = v2; 
    } 
}; 

class D:public B,public C { 
    int d1,d2; 
    D() { 
    } 

    D(int v1,v2):B(v1,v2),C(v1,v2),A(v1,v2) 
    { 
     d1 = v1; 
     d2 = v2; 
    } 
}; 

답변

1

또한 A에 대한 B에게 초기화를 제공하기 위해 완벽하게 괜찮아요. 가상 상속의 의미는 입니다.에 파생 된 객체가 더 많으면 가상 기반은 가장 많이 파생 된 객체로 구성됩니다. 그러나 B의 인스턴스 만 생성하는 경우 해당 인스턴스 은 가장 파생 된 객체 인입니다. 그러니 이런 식으로 쓰기 : 당신이 베이스 초기화가 무시됩니다 B에서 파생 때

class B : public virtual A 
{ 
public: 
    B() : A(1, 2) { } 
    // ... 
}; 

그것은 단지입니다.

0

당신이 할 수있는 일은 클래스에서 B와 C를 (가상 '키워드없이) A에서 정상적으로 상속 받지만 클래스 D는 B와 C로부터 사실상 상속하도록 만드는 것입니다. 그러면 클래스 B의 객체를 만들 수 있습니다 또는 C) 클래스 A 생성자에 대한 값 전달>