J'ai un problème que j'essaie de résoudre où j'aimerais avoir une classe de base abstraite, qui hérite de plusieurs classes, où les dérivations peuvent éventuellement avoir leurs méthodes substitué sans déclarer une classe supplémentaire. Je vais vous donner un exemple ici de ce que je suis en train de réaliser:Besoin de recommandations sur l'héritage multiple et le remplacement facultatif de fonction C++
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo() = 0;
protected:
A() {}
};
class A1 : public A
{
public:
A1() : A() {}
void foo() { cout << "A1 foo" << endl; };
};
class A2 : public A
{
public:
A2() : A() {}
void foo() { cout << "A2 foo" << endl; };
};
class B
{
public:
virtual void bar() { cout << "B bar: " << endl; }
};
class B1 : public B
{
public:
void bar()
{
cout << "B1 bar wrapper begin" << endl;
B::bar();
cout << "B1 bar wrapper end" << endl;
}
};
/*
???
pure virtual class C
enforce derived classes to inherit something of type A
enforce derived classes to inherit something of type B
class C1 : public A1, either B or B1 ??? templates???
{
}
class C2 : public A2, either B or B1 ??? templates???
{
}
Can this be done without having to define classes CA1B, CA2B, CA1B1, CA2B1, etc.?
*/
int main(int argc, char *argv[])
{
A1 a1;
a1.foo();
A2 a2;
a2.foo();
/*
C1 c1b with type B
C1 c1b1 with type B1
C2 c2b with type B
C2 c2b1 with type B1
put c1b, c1b1, c2b, c2b1 in a list named "combinations"
cout << "Printing combinations" << endl;
for (auto i : combinations)
{
i->foo();
i->bar();
}
*/
return 0;
}
En théorie, la sortie serait:
A1 foo
A2 foo
Printing combinations
A1 foo
B bar
A1 foo
B1 bar wrapper begin
B bar
B1 bar wrapper end
A2 foo
B bar
A2 foo
B1 bar wrapper begin
B bar
B1 bar wrapper end
S'il y a un moyen d'y arriver par un certain modèle de conception, ou J'utilise une mauvaise approche, s'il vous plaît faites le moi savoir. J'utilise C++ 11.
Est-ce que quelque chose comme ça peut être utilisé de façon polymorphe? Par exemple, si je crée un objet 'shared_ptr>' et un autre objet 'shared_ptr >', ces deux éléments peuvent-ils être stockés dans une 'liste >>'? Je ne suis pas sûr de ce qui est requis dans la classe C pour convertir une version dérivée à 'C '. –
George
@George - Non. Soit avec un modèle ou explicitement épelé (comme dans votre question) 'C ' et 'C' ne sont pas dans une relation polymorphe. –
StoryTeller
@George - Mais vous pouvez mettre toutes ces classes dans un conteneur de 'B *' ou un conteneur de 'A *'. – StoryTeller