J'ai une structure de classe beaucoup plus compliquée que celle-ci, mais en ramenant le problème à son essence, ceci décrit mon scénario: J'ai deux classes, A & B, qui implémentent des classes de base virtuelles pures qui partagent un ancêtre commun, puis une troisième classe C qui com-pose en principe un & B. Enfin, une classe de modèle qui remplit les méthodes communes dans la base virtuelle pure:Héritage ambigu des classes de base abstraites:
struct I {
virtual void r()=0;
};
struct A : I {};
struct B : I {};
struct C : A, B {
void q(){
r(); // the problem is here.
}
};
struct D : C {
virtual void r(){
}
};
C* c = new D;
c->q();
Mon problème est, je peux Ne voyez aucun moyen d'obtenir C :: q pour appeler r(). Comment puis-je appeler la méthode r() à partir de C afin que la méthode virtuelle correcte soit appelée? Désolé, j'aurais dû préciser que l'héritage virtuel ne peut pas être utilisé ici. J'ai trouvé deux solutions:
struct C : A, B {
virtual void r()=0;
...
OU
struct C : A, B {
using A::r;
...
Les deux semblent désambiguïser l'appel à r() suffisamment pour que tout résoudre.
+1 pour prendre votre problème et le décomposer dans sa forme la plus simple. –
Est-ce que r() ne sera pas ambigu en C sans héritage virtuel? – DumbCoder
Voulez-vous dire la classe de base virtuelle ou simplement la classe de base abstraite?Parce que pour rendre 'I' une base virtuelle, vous avez besoin de' struct A: virtual I {}; 'et' struct B: virtual I {}; '. –