C++ では、仮想継承では、すべての仮想ベースのコンストラクターを明示的に呼び出すために、最も派生した型のコンストラクターが必要です。
C( int r ) : A(r), B(r) {}
仮想継承が必要であると明確に述べていますが、仮想継承を使用することは一般的ではないため、ユース ケースを説明することをお勧めします。これを必要とせず、コンストラクターの連鎖を許可する代替手段があるかもしれません。
最も派生した型がコンストラクターを呼び出す必要があることに疑問を持っている場合、その理由は、virtual
継承が完全なオブジェクトにそのようなベースが 1 つしかないことを意味するためです。考えられる関係を考えると:
struct base { base( int x ); /*...*/ };
struct d1 : virtual base {
d1() : base(1) {}
// ...
};
struct d2 : virtual base {
d2() : base(2) {}
// ...
};
struct final : d1, d2 {};
base
insideの単一インスタンスのコンストラクターに渡す値はfinal
? 2 つの異なる継承パスが競合する値を渡していますが、初期化するオブジェクトは 1 つです。異なる呼び出しが競合していなくても、別のコンパイル モデルを使用すると、コンパイラはそれを認識できないため、唯一のオプションは、完全なオブジェクトが仮想ベースを初期化する方法を決定することです。