L'appel de fonction virtuelle de la classe dérivée de la classe de base constructeur?
Im essayant d'accomplir la même que celle qui est décrite dans la question précédente:
appel de fonction virtuel de la classe de base
Mais, ma vraie question est:
Que si f() est le constructeur de la classe de Base? Qui g() sera appelée? Je ne sais pas si je fais mal, mais dans mon programme, il me semble que c'est le contraire.
Prenant les mêmes variables à partir de la question précédente, un code qui affiche un tel
comportement devrait ressembler à ceci:
Class Base
{
Base(){g();};
virtual void g(){//Do some Base related code;}
};
Class Derived : public Base
{
Derived(){};
virtual void g(){//Do some Derived related code};
};
int main()
{
Derived newDerived;
return 0;
}
Mise à jour:
Merci à Lui.
Il m'a fourni une page qui contient toutes les informations relatives à ce sujet.
Ill vous laisser savoir le lien ici:
parashift.com/c++-faq-lite/étrange héritage.html#faq-23.6
Pouvez-vous montrer un exemple de code qui présente ce comportement?
OriginalL'auteur Jesufer Vn | 2011-07-03
Vous devez vous connecter pour publier un commentaire.
Même si c'est une fonction virtuelle, la base de la version sera appelée depuis la classe dérivée n'est pas encore construit. Le constructeur de classe de base est appelé avant que le constructeur de classe dérivée, donc si la dérivée de la fonction virtuelle ont été appelés, ce serait avec une incomplètement-initialisé exemple - que possible (probablement) recette pour un désastre.
OriginalL'auteur Jim Buck
Il
Base::g()
. Voir ce FAQ pour les explications.OriginalL'auteur Naveen
Lorsque votre constructeur de classe de base est appelé, seule la vtable pour la classe de base est de l'installation, de sorte que toute virtuelle appels de fonction s'applique uniquement aux méthodes de classe de base.
Lors de la classe dérivée constructeur est appelé, l'appel d'une fonction virtuelle qui fera appel à la classe dérivée de remplacer, le cas échéant.
OriginalL'auteur dhaag23
Le virtuel mécanisme ne fonctionne pas dans les constructeurs, donc, si vous appelez même une fonction virtuelle à partir d'un constructeur de classe de base tu finis toujours par appeler les fonctions de la classe de base seulement. Il y a quelques raisons pourquoi le virtuel funcs ne pas travailler dans le ctors:
OriginalL'auteur Garry