はじめに:派生(具象)クラス型のオブジェクトからの(抽象)基本クラス参照を格納できるようにしたいので、後でポインターに頼らずに同じ派生(具象)クラスにキャストできます。所有権、メモリリーク、ダングリングポインタ/不正な参照について心配する必要があります。
以下の階層を使用して、試行されたコンストラクター呼び出し:A(/* Other variables */, Bar(/* Bar variables */));
「警告3警告」で失敗しますC4239:非標準の拡張子が使用されました:「引数」:「Bar」から「Foo&」への変換(Visual Studio 2010 SP1)
とコンストラクターの初期化をclass O
含むように変更すると、コンストラクターの終了時に一時オブジェクトが破棄されるため、ダングリングポインターが発生します。Foo* _foo
/*...*/, _foo(&foo)
参照を期待し、コードを混乱させないクラスに一時オブジェクトを渡す方法はありますか?
`
/* ABSTRACT BASE CLASS */
class Foo {
//...
};
/* DERIVED, CONCRETE CLASS */
class Bar : public Foo {
//...
};
class O {
O(/* Other variables */, Foo& foo) : /* Other member variable initializations */, _foo(foo) { }
//...Other member variables here...
Foo& _foo;
friend class A;
};
class A {
public:
A(/* Other individual variables used to fully construct object 'O' */, Foo& foo) : /*...*/, _foo(foo) { }
private:
O _o
};