コンパイラの警告 (レベル 1 およびレベル 4、オフ) C4355
'
this
': ベース メンバー初期化リストで使用されました
this
ポインターは、静的でないメンバー関数の内部でのみ有効です。 基底クラスの初期化子リストでは使用できません。
基底クラスのコンストラクターとクラス メンバーのコンストラクターは、this
のコンストラクターよりも先に呼び出されます。 このパターンは、まだ作成されていないオブジェクトへのポインターを、別のコンストラクターに渡すことと同じです。 これらの他のコンストラクターが、いずれかのメンバーにアクセスするか、this
に対してメンバー関数を呼び出した場合、結果は未定義になります。 すべての作成が完了するまでは、this
ポインターを使用しないでください。
既定では、この警告はオフに設定されています。 詳細については、「 Compiler Warnings That Are Off by Default」を参照してください。
次の例では 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;
}