héritages multiples et fonctions abstraites
Bonjour,
J'ai une classe B qui hérite d'une classe A.
Ces deux classes ( des IHM en fait ) utilisent des présenteurs pA et pB. pB héritant de pA.
Pour des raisons d'architecture, A et B ne peuvent pas connaitre pA et pB directement. J'ai donc définit deux interfaces abstraites ipA, et ipB. ipB hérite de ipA. Mes deux présenteurs héritent donc de ces deux interfaces.
Mais quand je compile, j'ai un erreur m'indiquant que pB ne peut pas être instancié car il est abstrait à cause des fonctions abstaites de ipA.
Ce petit exemple dvrait vous aider à comprendre:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
#include <iostream>
using namespace std;
// Interfaces
struct ipA {
virtual void foo() = 0;
};
struct ipB : public ipA {
virtual void bar() = 0;
};
// Présenteurs
struct pA : public ipA {
virtual void foo(){ cout << "A::foo" << endl; }
};
struct pB : public ipB, public pA {
//void foo(){ cout << "B::foo" << endl; }
virtual void bar(){ cout << "B::bar" << endl; }
};
// IHM
struct A {
ipA & _p;
A( ipA & pa ) : _p(pa){}
void a(){ _p.foo(); }
};
struct B : public A {
ipB & _p;
B( ipB & pb ) : A( pb ), _p(pb){}
void b(){ _p.bar(); }
};
// Et le main qui va bien
int main() {
pA pa; pB pb;
A a(pa); B b(pb);
a.a();
b.a(); b.b();
return 0;
} |
Citation:
Erreur E2352 heritage.cpp 43: Impossible de crÚer une instance de la classe abstraite 'pB' dans la fonction main()
Erreur E2353 heritage.cpp 43: La classe 'pB' est abstraite parce que ipA::foo() = 0' dans la fonction main()
D'où la question ultime sur la vie, l'univers et le reste : Comment faire pour mettre en place une telle architecture ?
La seule méthode que j'ai trouvé consiste à redéfinir les méthode de ipA dans pB. Mais ce n'est pas génial.