mise à jour: remplaçait l'exemple destructeur avec un exemple de méthode de méthode droit.
hi, p>
Si j'ai le code suivant: p> merci p> p>
4 Réponses :
Oui, car sa classe de base en a un; Aussi, son destructeur est virtuel (même si vous ne l'avez pas déclaré virtuel) car le destructeur de la classe de base est virtuel. p> li>
NON P> LI>
no. p> li>
non. En fait, je ne pense pas que le code actuel est légal: le compilateur invoquera le destructeur après avoir invoqué le destructeur B, même si vous n'appelez pas explicitement ~ A de ~ B; Donc, je ne pense pas que vous devriez invoquer ~ a de ~ b même si le compilateur vous permet de. p> li> ol>
Désolé. Je n'aurais pas dû utiliser des destructeurs comme exemple. Mis à jour.
Si vous déclarez des fonctions virtuelles vous devez également déclarer votre destructor virtuel; -). P>
B a une table virtuelle, car il a une fonction virtuelle, à savoir Les fonctions non virtuelles ne sont pas référencées par vtables. P> li>
Voir 2. P> li>
Non. Les vtables de cours sont construits à partir des déclarations de classe. Les corps des fonctions de classe (sans parler d'autres fonctions) ne sont pas prises en compte. Par conséquent, B a une vtable, parce que sa fonction Il y a aussi un détail délicat, bien que ce n'est pas l'essentiel de votre question. Vous déclarez votre fonction func0 () code>. Si vous déclarez une fonction (y compris un destructor) virtuel dans une classe de base, toutes ses classes dérivées auront la fonction avec la même signature virtuelle ainsi. Et il leur causer un vtable. De plus, B aurait vtable même si vous n'avez pas fait
func0 code> explicitement. P> li>
func0 () code> est virtuel. P> li>
ol>
B :: func0 () code> en ligne. Dans le cas d'une fonction virtuelle est déclarée en ligne, il conserve son emplacement dans la table virtuelle, la fente pointant vers une fonction spéciale émise pour que l'on en ligne (qui compte comme prenant son adresse,
gcc code> compilateur, ce qui rend le émis en ligne). Cela signifie que, si le funciton est en ligne n'a pas d'influence quantité de créneaux horaires dans vtable et sa nécessité pour une classe. P>
Mis à jour. De plus, si fondamentalement, si une fonction est déclarée virtuelle dans toute classe de base i> dans la hiérarchie d'héritage, cette fonction est virtuelle même si la classe de base directe (1 niveau ci-dessus) ne le marquait pas comme virtuel?
@ Jameszhao00: a également mis à jour la réponse. Vous l'avez corrigé: si une classe de base indirecte (c'est-à-dire un parent d'un parent de certains parents ... de la classe actuelle) déclare la fonction virtuelle, c'est aussi virtuelle dans la classe actuelle. Notez que les fonctions surchargées (void f (int) par rapport au vide F (double)) sont traitées comme des fonctions différentes.
faire référence à l'exemple mis à jour: p>
Quelques notes supplémentaires (compilateur dépendante, mais ce sont des généralisations assez courantes): p>
Je serais bien si vous racontez dans de telles questions, quel compilateur vous utilisez. Les tables virtuelles sont spécifiques à la mise en œuvre, bien que des efforts soient des efforts pour normaliser leur format.