Aviso do compilador (nível 1 e nível 4, desativado) C4355
"
this
": usado na lista de inicializadores de membro base
O ponteiro this
é válido somente dentro de funções de membro não estáticas. Ele não pode ser usado na lista de inicializadores para uma classe base.
Os construtores de classe base e construtores membros da classe são chamados antes do construtor this
. Este padrão é o mesmo que passar um ponteiro para um objeto não estruturado para outro construtor. Se esses outros construtores acessarem membros ou chamarem funções de membro em this
, o resultado será indefinido. Você não deve usar o ponteiro this
até que toda a construção seja concluída.
Esse aviso está desativado por padrão. Para obter mais informações, confira Avisos do compilador desativados por padrão.
O exemplo a seguir gera o erro 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;
}