コンパイラの警告 C4355
'this' : ベース メンバー初期化リストで使用されました。
this ポインターは、静的でないメンバー関数の内部でのみ有効です。 基底クラスの初期化子リストでは使用できません。
基底クラスのコンストラクターとクラス メンバーのコンストラクターは、this のコンストラクターよりも先に呼び出されます。 実際には、まだ作成されていないオブジェクトへのポインターを、別のコンストラクターに渡しました。 これらの他のコンストラクターが、いずれかのメンバーにアクセスするか、これに対してメンバー関数を呼び出した場合、結果は未定義になります。 すべての作成が完了するまでは、this ポインターを使用しないでください。
既定では、この警告はオフに設定されています。 詳細については、「 既定で無効になっているコンパイラ警告 」を参照してください。
次の例では C4355 が生成されます。
// C4355.cpp
// compile with: /w14355 /c
#include <tchar.h>
class CDerived;
class CBase {
public:
CBase(CDerived *derived): m_pDerived(derived) {};
~CBase();
virtual void function() = 0;
CDerived * m_pDerived;
};
class CDerived : public CBase {
public:
CDerived() : CBase(this) {}; // C4355 "this" used in derived c'tor
virtual void function() {};
};
CBase::~CBase() {
m_pDerived -> function();
}
int main() {
CDerived myDerived;
}