2012-01-01 3 views
2

AFAIK, l'héritage virtuel résout le problème du diamant, mais que se passe-t-il si j'utilise le virtuel pour hériter simplement de la classe de base? Quelle est la différence avec l'utilisation virtual ici?Héritage virtuel de la classe de base

class A 
{ 
    /* ... */ 
}; 

class B : virtual public A 
{ 
    /* ... */ 
}; 

Répondre

2

Il existe quelques différences. La disposition des objets sera différente (dans le cas de l'héritage virtuel, il y aura un pointeur caché supplémentaire à la base dans le sous-objet dérivé), l'initialisation des sous-objets différera (un type dérivant de B devra appeler le constructeur A directement dans la liste d'initialisation). Tout code dans B les fonctions membres qui fait référence à A membres (données ou fonctions) nécessitera une indirection supplémentaire (à travers le pointeur mentionné précédemment), et éventuellement d'autres différences.

L'héritage virtuel est une question complexe et vous devriez probablement lire plus de liens fournis dans les réponses à votre question précédente que d'essayer de comprendre en obtenant simplement des bribes de questions distinctes.

Indice: Si vous souhaitez comprendre les détails de la gestion de l'héritage virtuel par le compilateur, vous devez vous concentrer sur la mise en forme de la mémoire des objets. Une fois que vous comprenez pourquoi le pointeur supplémentaire par classe qui dérive virtuellement est nécessaire, le reste est simple.

Questions connexes