1

次のように、ベースが V である B1 と B2 の両方から D が継承するダイヤモンド継承を取得したとします。

struct V { 
    V(){cout << "V()" << endl;}
    V(int){cout << "V(int)" << endl;}
}; 
struct B1 : virtual V {
    B1(){cout << "B1()" << endl;}
    B1(int i): V(i) {cout << "B1(int)" << endl;
        /*…*/ }
};
struct B2 : virtual V {
    B2(){cout << "B2()" << endl;}
    B2(int i) { cout << "B2()" << endl; }
};
struct D : B1, B2 {
    D(int i): V(i) { cout << "D(int)" << endl; }
};

D* パラメータを初期化するとき、B1 および B2 のデフォルト コンストラクタが V コンストラクタを呼び出すことを期待しています。しかし、次の行を実行すると、V が 1 回呼び出されました。なんで?

D* d = new D(1);

前もって感謝します。

4

2 に答える 2