65 votes

Comment pouvez-vous éviter le Diamant de la Mort en C ++ lorsque vous utilisez l'héritage multiple?

http://en.wikipedia.org/wiki/Diamond_problem

Je sais ce que cela signifie, mais quelles mesures puis-je prendre pour l'éviter?

75voto

Mark Ingram Points 24995

Un exemple pratique:

 class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
 

Remarquez comment la classe D hérite de B & C, mais B et C héritent de A. Cela entraînera l'inclusion de 2 copies de la classe A dans la table vtable.

Pour résoudre ce problème, nous avons besoin d'un héritage virtuel. C'est la classe A qui doit être virtuellement héritée. Donc, cela résoudra le problème:

 class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
 

14voto

eduffy Points 17061

héritage virtuel. C'est pour ça que c'est là.

13voto

Bob Somers Points 4186

Je me contenterais d'utiliser plusieurs héritages d'interfaces seulement. Si l'héritage multiple de classes est parfois attrayant, il peut également être déroutant et douloureux si vous vous en remettez régulièrement à cela.

3voto

NItish Points 31
 class A {}; 
class B : public A {}; 
class C : public A {}; 
class D : public B, public C {};
 

En cela, les attributs de la classe A répétés deux fois dans la classe D, ce qui augmente l'utilisation de la mémoire ... Donc, pour économiser de la mémoire, nous créons un attribut virtuel pour tous les attributs hérités de la classe A qui sont stockés dans une table Vtable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X