次の方法で共有


コンパイラの警告 (レベル 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;
}