10
votes

C ++ Héritage / Questions pour ordinateurs bancaires

mise à jour: remplaçait l'exemple destructeur avec un exemple de méthode de méthode droit.

hi,

Si j'ai le code suivant: xxx

  1. Y a-t-il un circuit bancaire en B? B n'a aucune fonction virtuelle mais appelle A :: Func0 () de B :: Func0 ()
  2. Func1 réside-t-il dans un circuit bancaire? Ce n'est pas virtuel.
  3. Func2 réside dans un circuit bancaire?
  4. Les réponses à ce qui précède seront différentes s'il n'y avait pas de :::: Func0 () appeler B ::: Func0 ()?

    merci


1 commentaires

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.


4 Réponses :


5
votes
  1. 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.

  2. NON

  3. no.

  4. 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.


1 commentaires

Désolé. Je n'aurais pas dû utiliser des destructeurs comme exemple. Mis à jour.



19
votes

Si vous déclarez des fonctions virtuelles vous devez également déclarer votre destructor virtuel; -).

  1. B a une table virtuelle, car il a une fonction virtuelle, à savoir func0 () . 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 explicitement.

  2. Les fonctions non virtuelles ne sont pas référencées par vtables.

  3. Voir 2.

  4. 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 func0 () est virtuel.

    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 B :: func0 () 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 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.


2 commentaires

Mis à jour. De plus, si fondamentalement, si une fonction est déclarée virtuelle dans toute classe de base 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.



3
votes

faire référence à l'exemple mis à jour:

  1. oui, b a une machine à table. Notez que B :: Func0 () est virtuel (remplace A ::: Func0 ()), même si vous ne l'émettez pas explicitement comme virtuel. Weird C ++ "Loopophole", je suppose.
  2. non. Les fonctions non virtuelles ne résident pas dans la table de table.
  3. Voir 2.
  4. non. Vous avez remplacé A: Func0 (); Peu importe si vous appelez un :: Func0 () ou non.

    Quelques notes supplémentaires (compilateur dépendante, mais ce sont des généralisations assez courantes):

    • Chaque instance de B aura un pointeur sur un circuit équitable, car vous êtes dérivé d'une classe qui a des fonctions virtuelles.
    • Ce serait le cas Même si vous ne définissez pas B :: Func0 () .
    • Dans cette situation, le compilateur peut avoir des instances de b pointez sur A statique statique ou pour créer une table de distribution statique pour B et remplissez-le avec des pointeurs à des pointeurs vers des membres de a .
    • Mais il est toujours requis , afin que vous puissiez accéder correctement à une instance de b via un pointeur sur a . .

0 commentaires

1
votes
  • Si la fonction de la classe de base est virtuelle, alors si vous remplacez cette fonction de classe dérivée, il est implicitement virtuel même si vous ne spécifiez pas explicitement. Si la classe a une fonction virtuelle, il a une table V.
  • Seules les fonctions virtuelles présentes dans une table de plans virtuelle, fonction1 ne réside pas dans une table / liaison>
  • Fonction2 ne réside pas dans la même raison pour la même raison ci-dessus
  • Création de Table de Table ne dépend pas de savoir si vous appelez cette fonction de la classe de base ou d'ailleurs. L'appel de la fonction ne décide pas la création de table à table.

0 commentaires