Si vous déclarez des fonctions virtuelles, vous devez également déclarer votre destructeur virtuel ;-).
B dispose d'une table virtuelle, car il a une fonction virtuelle, à savoir func0()
. Si vous déclarez une fonction (y compris un destructeur) virtuelle dans une classe de base, toutes ses classes dérivées auront aussi la fonction avec la même signature virtuelle. Et cela les amènera à avoir un vtable. De plus, B aurait la vtable même si vous n'y avez pas déclaré func0
explicitement.
Les fonctions non virtuelles ne sont pas référencées via vtables.
Voir 2.
N ° de vtables de classes sont construites à partir des déclarations de classe. Les corps des fonctions de classe (sans parler des autres fonctions) ne sont pas pris en compte. Par conséquent, B a un vtable, car sa fonction func0()
est virtuelle.
Il y a aussi un détail délicat, même si ce n'est pas l'essentiel de votre question. Vous avez déclaré votre fonction B::func0()
comme en ligne. Dans le compilateur gcc
, si une fonction virtuelle est déclarée en ligne, elle conserve son emplacement dans la table virtuelle, l'emplacement pointant vers une fonction spéciale émise pour celle en ligne (qui compte comme prenant son adresse, ce qui rend l'inline émise). Cela signifie que le fait que la fonction soit inline n'influence pas le nombre de slots dans vtable et sa nécessité pour une classe.
Je serais bien si vous dites dans ces questions quel compilateur vous utilisez. Les tables virtuelles sont spécifiques à l'implémentation, bien que des efforts soient déployés pour standardiser leur format. –
'b :: func0' ** est ** virtuel –