Advertencia del compilador C4355
'this': utilizado en la lista de inicializadores de miembro base
El puntero this sólo es válido para funciones miembro no estáticas. No se puede utilizar en la lista de inicializadores de una clase base.
Las llamadas a los constructores de clase base y miembros de clase tienen lugar antes de este constructor this. En efecto, se ha pasado un puntero a un objeto no construido a otro constructor. Si esos otros constructores obtienen acceso a cualquier miembro o llaman a funciones miembro en this, el resultado será indefinido. No se debe usar el puntero this hasta que finalicen todas las operaciones de construcción.
De forma predeterminada, esta advertencia está desactivada. Para obtener más información, vea Advertencias del compilador desactivadas de forma predeterminada.
El código siguiente genera el error 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;
}