0

Pourquoi le code ci-dessous n'est pas ambigu et comment cela fonctionne?Pourquoi ce morceau de code "n'est pas ambigieux!" - fonctions virtuelles

#include <QCoreApplication> 
#include <iostream> 
using namespace std; 

class Shape{ 
public: 
    virtual void drawShape(){ 
     cout << "this is base class and virtual function\n"; 
    } 
}; 

class Line : public Shape{ 
public: 
    virtual void drawShape(){ 
     cout << "I am a line\n"; 
    } 
}; 

class Circle : public Shape{ 
public: 
    virtual void drawShape(){ 
     cout <<" I am circle\n"; 
    } 
}; 

class Child : public Line, public Circle{ 
public: 
    virtual void drawShape(){ 
     cout << "I am child :)\n"; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    //Shape *s; 
    //Line l; 
    Child ch; 
    //s = &l; 
    //s = &ch; 
    ch.drawShape(); // this is ambiguous right? but it executes properly! 
    //s->drawShape(); 
    return a.exec(); 
} 
+1

Ceci n'est pas un exemple de [héritage virtuel] (http://stackoverflow.com/questions/21558/in-c-what-is-a-virtual-base-class), ce qui est quelque chose de totalement différent. –

+0

@BoPersson en quoi est-ce différent de l '«héritage virtuel»? –

+1

bien oui @BoPersson mais l'héritage que j'ai utilisé est un exemple de problème de diamant. Je suis un peu confus concernant les "appels d'ambiguïté" – highlander141

Répondre

3

Il n'est pas ambigu parce Child définit son propre override de drawShape et ch.drawShape appellera cette fonction. Si Child n'a pas fourni un remplacement de drawShape alors l'appel serait ambigu.

+1

mais même si j'enlève le mot-clé virtuel dans la classe de base, même alors son fonctionnement! – highlander141

+0

@ highlander141 La classe de base ici n'a rien à voir avec l'ambiguïté. C'est ce qui est connu au moment de l'appel qui le rend ambigu comme je l'ai déjà expliqué. – 1201ProgramAlarm

+0

s'il vous plaît montrez-moi dans mon exemple lui-même – highlander141