Compartir vía


Advertencia del compilador (niveles 1 y 4, desactivada) C4355

"this": se usa en la lista de inicializadores de miembro base

El puntero this es válido solo dentro de funciones miembro no estáticas. No se puede usar en la lista de inicializadores para una clase base.

Los constructores de clase base y los constructores de miembro de clase se llaman antes que el constructor this. Este patrón equivale a pasar un puntero a un objeto no construido a otro constructor. Si esos otros constructores acceden a cualquier miembro o llaman a funciones miembro en esta instancia de this, el resultado no será definido. No debe usar el puntero this hasta que se complete toda la construcción.

De forma predeterminada, esta advertencia está desactivada. Para obtener más información, consulte Compiler Warnings That Are Off by Default.

El ejemplo siguiente genera la advertencia 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;
}