Base->Center->Childの3つのクラスタイプがあり、親タイプから子タイプを構築できるようにしたいので、次のように宣言しました。
class Base {
public:
Base(void) {cout << "Base()" << endl;}
virtual ~Base(void) {}
Base(const Base &ref) {cout << "Base(const Base &)" << endl;}
};
class Center : public virtual Base {
public:
Center(void) : Base() {cout << "Center()" << endl;}
Center(const Base &ref) : Base(ref) {cout << "Center(const Base &)" << endl;}
};
class Child : public virtual Center {
public:
Child(void) : Center() {cout << "Child()" << endl;}
Child(const Base &ref) : Center(ref) {cout << "Child(const Base &)" << endl;}
};
次のように呼び出しても問題ありません: (Center と Base のコピー コンストラクターを呼び出します)
Base base;
Center center(base);
.
ただし、これらのコードは予期しない動作をします。
Child child(base);
出力は次のとおりです。
Base()
Center(const Base &)
Child(const Base &)
Base(const Base &) の代わりに Base(void) と呼ばれるのはなぜですか?
解決済み (Dietmar Kühlと Adam Burry に感謝)
2 つの方法:
1. add Base(const Base &) to Child, which would looks like this:
Child(const Base &ref) : Base(ref), Center(ref) {}
2. or, remove virtual inheritance, which would looks like this:
class Center : public Base {...}
class Child : public Center {...}