2017-08-29 3 views
0

Considérons l'extrait de code suivant:héritage virtuel et les membres fonction

struct A { void f(); }; 
struct B : virtual A {}; 
struct C : virtual A {}; 
struct D : B, C {}; 

Que puis-je dire? que D a deux fonctions membres différentes B::A::f et C::B::f qui sont appelées sur un même objet? ou ils sont juste des alias d'une même fonction membre?

Par exemple, pour le cas non virtuel,

struct A { void f(); }; 
struct B : A {}; 
struct C : A {}; 
struct D : B, C {}; 

D a deux fonctions membres différents B::A::f et C::A::f parce qu'ils ont juste des noms différents, donc, appeler D().f() est une ambigüité parce que je dois préciser à quel membre je veux appeler. Cependant, dans le cas de l'héritage virtuel, cela n'est plus nécessaire parce que l'appel d'un chemin ou d'un autre se résout à appeler la fonction sur un même objet, et je ne sais plus si, dans l'héritage virtuel, J'ai deux fonctions membres différentes qui résout ou sont exécutées sur un même objet, ou ce sont juste des alias d'une même fonction membre.

Quoi qu'il en soit, d'un point de vue pratique, cette différence n'a pas d'importance, mais d'un point de vue plus formel, je ne suis pas sûr de ce qu'il faut dire.

+0

@Bon En bref, je ne sais pas combien de membres fonction (sans tenir compte de la valeur par défaut -generated members) a D. –

+1

vous venez de redécouvrir ce que l'héritage virtuel est bon pour: P – user463035818

Répondre

2

Dans le cas de l'héritage virtuel, vous avez D::A::f() et aucune version spécifique substituée dans les deux niveaux d'héritage intermédiaires.

D().B::A::f() œuvres pour la même raison que cela fonctionne dans ce cas simple (il hérite de la version parent):

struct A { void f(); }; 
struct B : A {}; 
struct D : B {}; 
+0

Si tel était le cas, comment 'D(). B :: A :: f()' compile même, si 'D ' n'a pas une telle fonction de membre? –