Considérez l'architecture suivante:C++ héritage multiple de diamants et pures fonctions virtuelles
class A //abstract interface
{
public:
virtual void f() = 0;
};
class AA : public A //abstract interface
{
public:
virtual void g() = 0;
};
class AAA : public AA //abstract interface
{
public:
virtual void h() = 0;
};
class B : public A // implementation class
{
public:
void f() override {};
};
class BB : public B, public AA {}; // implementation class
{
public:
void g() override {};
};
class BBB : public BB, public AAA {}; // implementation class
{
public:
void h() override {};
};
En tant que tel, BB
et BBB
sont des classes virtuelles, parce que f n'est pas remplacée par BB, ni f, ni g sont par BBB. Mon souhait est de pouvoir instancier BB et BBB (de sorte que BB et BBB utilisent l'override de f défini par B, et BBB utilise l'override de g défini par BB).
La question est: qui les relations d'héritage devraient être marqués comme virtual
instancier BB
et BBB
?
Le diagramme d'héritage devrait idéalement ressembler à ceci:
A
|\
| \
| \
AA B
| \ |
| \ |
AAA BB
\ |
\ |
BBB
L'idée derrière cette conception est que A, AA et AAA sont des interfaces qui décrivent les niveaux de fonctionnalités supplémentaires. B, BB et BB sont une implémentation incrémentielle correspondante. (Ainsi que BB définit par exemple tout ce dont AA a besoin, et comporte aussi ce qu'il y a en B)
Votre manque le modificateur virtuel dans vos définitions de classe, je pense, sinon tout votre question n'a pas de sens. Les détails sont importants –
Bien sûr, je voulais dire le modificateur virtuel des FONCTIONS –