2013-01-23 18 views
5

可能性の重複:つまり
Default constructor and virtual inheritance仮想継承とパラメータ化コンストラクタ

class Base 
{ 
private: 
    int number; 
protected: 
    Base(int n) : number(n) {} 
public: 
    virtual void write() {cout << number;}  
}; 

class Derived1 : virtual public Base 
{ 
private: 
    int number; 
protected: 
    Derived1(int n, int n2) : Base(n), number(n2) {} 
public: 
    virtual void write() {Base::write(); cout << number;} 
}; 

class Derived2 : virtual public Base 
{ 
private: 
    int number; 
protected: 
    Derived2(int n, int n2) : Base(n), number(n2) {} 
public: 
    virtual void write() {Base::write(); cout << number;} 
}; 

class Problematic : public Derived1, public Derived2 
{ 
private: 
    int number; 
public: 
    Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), number(n4) {} 
    virtual void write() {Derived1::write(); Derived2::write(); cout << number;} 
}; 

int main() 
{ 
    Base* obj = new Problematic(1, 2, 3, 4); 
    obj->write(); 
} 

3 4 "を出力します。しかし、コンパイラは、Baseでパラメータのないコンストラクタが必要だと不平を言っていますが、追加すると "1"がゴミに変わります。どのようにそれにアプローチする上の任意のアイデア?パラメータ化されたコンストラクタを使用してダイヤモンドパターンを解くことも可能ですか?

+1

あなたは行方不明; 'sの派生クラス – cppguy

+0

@cppguyに - 私はそれを見ることはありませんが、それはともかく、実際のコード(おそらくタイプミス)ではありません。 –

+0

@MaciejStachowski ildjarnはそれをあなたのために追加しました –

答えて

2

Calling a virtual base class's overloaded constructorを見てください。継承が仮想の場合、最も派生したクラスは基本クラスのコンストラクタを呼び出す必要があります。

Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), Base(n), number(n4) {} 
+0

つまり、Derived1/2やそのサブクラスを継承するすべてのクラスは、Baseコンストラクタを呼び出す必要がありますか?私のC++への愛はちょっと収縮しました。 –