5

重複の可能性:
デフォルトのコンストラクターと仮想継承

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();
}

言い換えると:

Base
| \
|  \
|   \
|    \
D1   D2
|    /
|   /
|  /
| /
Problematic

出力で「12134」を取得しようとしています。ただし、コンパイラーはBaseにパラメーターのないコンストラクターが必要であると不平を言い続けますが、コンストラクターを追加すると、「1」はガベージに変わります。それにアプローチする方法について何かアイデアはありますか?パラメータ化されたコンストラクタを使用してダイヤモンドパターンを解決することも可能ですか?

4

1 に答える 1

2

Take a look at Calling a virtual base class's overloaded constructor, it looks like if the inheritance is virtual, the most derived class must call the base class constructor.

Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), Base(n), number(n4) {}
于 2013-01-23T01:47:19.213 に答える