B1
の部分this
は既に初期化されているので使用しても大丈夫です。§12.6.2/5:「直接基本クラスは、(mem-initializersの順序に関係なく)base-specifier-listに表示される宣言順序で初期化されるものとします。」
ここでのbase-specifier-listはですclass D : public B1, public B2
。mem-initializer-listはD::D() : B1(), B2( … )
です。
でも、これには「コードの臭い」があると思います。
編集:this
メンバーの初期化子が含まれていないコンストラクターの本体の外部で未定義であるかどうかについて、あなたの懸念を理解しました。これを可能にする言葉は2つの例の間に埋もれていて、最初はそれを見逃しました。パラグラフ7:「mem-initializerの式リスト内の名前は、mem-initializerが指定されているコンストラクターのスコープで評価されます。」
B2
実際にへのポインタを保持する必要がB1
あり、そのポインタが常に最も派生したオブジェクト内を指す場合は、仮想継承を検討してください。
class B1 {};
class B2 : virtual B1 {}; // under the hood, B2 has a pointer to B1.
class D : public virtual B1, public B2 {}; // D has a pointer too
// Only the most-derived class (the one actually used for instantiation)
// implements space for and initialization of the B1.