2013-06-07 3 views
2

Ok, donc je comprends comment résoudre le problème de l'héritage du diamant de la mort quand vous avez un contrôle total sur toutes les classes, mais que se passe-t-il si vous avez le contrôle sur la dernière classe? ceci:C++ Diamant de la mort

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

et je n'ai aucun moyen d'édition B et C seulement D, est-il un moyen facile, je peux le faire?

+5

Utiliser la composition? AFAIK, si vous ne pouvez pas modifier les déclarations à la classe B: public A virtuel etc, vous êtes coincé .. – Nim

+3

Ce que vous avez écrit n'est pas un diamant, donc il n'y a pas de problème ... –

Répondre

2

Faux par confinement. Avoir D contient B et C et donner à D la même interface publique que l'union de l'interface publique de B et C. Appelez ensuite les méthodes appropriées de B et C à partir de l'interface publique de D.

Bien sûr, vous aurez un problème de casting et de polymorphisme car il ne suivra pas les lois de l'héritage.

En bref, il n'y a pas de bon moyen.

3

C'est une très bonne raison pour laquelle vous ne pouvez pas forcer B et C à partager A. Tenir compte:

struct A {int i;}; 
struct B : A { 
B(){i=3;} 
void foo() { 
    //crash if i!=3 
} 
}; 
struct C : A { 
C(){i=4;} 
void bar() { 
    //crash if i!=4 
} 
}; 

B et C sont bonnes classes. Ils ne peuvent pas gérer une situation dans laquelle ils ne rentreront pas (valeur invalide de i).

S'il y avait un moyen de faire ce que vous demandez (struct D:B,C, où B et C parts A), quelle sera la valeur de D::A::i? L'héritage virtuel signifie "J'ai besoin de cette classe, mais je ne vais pas avoir besoin de valeurs valides pour cela, et je vais bien avec quelqu'un d'autre avec ça".

+0

Si 'i' devrait conserver sa valeur initiale, peut-être devrait-il être «const». Et 'A' devrait avoir un constructeur. – curiousguy

+0

@curiousguy Je n'ai jamais dit qu'il devrait garder sa valeur initiale. Peut-être existe-t-il une autre classe E: A qui peut changer pendant son fonctionnement. (Si vous insistez, considérez une situation où B a besoin d'une valeur impaire, et C une valeur paire) Quoi qu'il en soit, tout cela n'a rien à voir avec mon point principal: l'héritage virtuel signifie "Je vais bien avec quelqu'un d'autre avec mon A" , et si B (et C) n'ont pas dit cela, ce n'est pas une bonne idée de les forcer à partager A. – asaelr

+0

Si la variable est en effet variable, alors 'foo' et' bar' ne peuvent pas s'attendre à ce que 'i' conserve sa valeur initiale. – curiousguy