Avertissement du compilateur (niveau 1 et niveau 4, désactivés) C4355
'
this
' : utilisé dans la liste des initialiseurs membres de base
Le pointeur this
est valide uniquement dans les fonctions membres non statiques. Il ne peut pas être utilisé dans la liste d’initialiseurs pour une classe de base.
Les constructeurs de classe de base et les constructeurs membres de classe sont appelés avant le constructeur this
. Ce modèle est le même que le passage d’un pointeur à un objet non construit à un autre constructeur. Si ces autres constructeurs accèdent à des membres ou appellent des fonctions membres sur this
, le résultat n’est pas défini. Évitez d’utiliser le pointeur this
tant que l’intégralité de la construction n’est pas terminée.
Cet avertissement est désactivé par défaut. Pour plus d'informations, consultez Compiler Warnings That Are Off by Default.
L’exemple suivant génère l’avertissement 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;
}