héritage à répétition et methodes virtuelles pures
j'aimerais bien faire un truc un peu special, que je decris dans ce petit bout de code. Oui oui je sais que deux instances de A sont créées dans la création de C, c'est bien ce que je veux
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
|
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A created" << endl;
}
virtual void method() = 0;
};
class B : public A {
public:
void method() {
cout << "method B" << endl;
}
};
class C : public B, public A {
public:
void method() { // la je veux redefinir A::method()
cout << "method C" << endl;
}
};
void func(A & a) {
a.method();
}
int main() {
C c;
func(c);
} |
mais le compilo il veut pas :
Code:
1 2 3 4 5
|
inheritance.cpp:21: warning: direct base `A' inaccessible in `C' due to
ambiguity
inheritance.cpp: In function `int main()':
inheritance.cpp:34: error: `A' is an ambiguous base of `C' |
bon vous avez compris ce que je veux faire
Vous me direz que ce n'est pas propre mais je ne vois pas le problème de conception moi, dans C il suffirait de spécifierA:: ou B::A:: pour avoir un accès non ambigus a tous les membres...
qu'est ce que vous en dites ? comment résoudre ce "problème" ?
Re: héritage à répétition et methodes virtuelles pures
Citation:
Envoyé par Nico65
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
|
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A created" << endl;
}
virtual void method() = 0;
};
class B : public A {
public:
void method() {
cout << "method B" << endl;
}
};
class C : public B, public A {
public:
void method() { // la je veux redefinir A::method()
cout << "method C" << endl;
}
};
void func(A & a) {
a.method();
}
int main() {
C c;
func(c);
} |
Citation:
Envoyé par Je sais plus qui
Tout problème de génie logiciel peut se résoudre à l'aide d'un niveau d'indirection supplémentaire
Le seul moyen que je connaisse pour redéfinir une fonction virtuelle avec de l'héritage en diamant est de passer par une/des classe(s) intermédiaires :
Quand tu veux écrire la classe C, tu peux écrire une classe C_From_B dérivant de B et redéfinissant A::méthode pour cette instance de A dans le C final, et une autre classe C_From_A dérivant drectement de A et faisant de même. Ta classe C dérive alors de C_From_B et de C_From_A.