2017-02-13 2 views
1
#include <iostream> 
using namespace std; 
class A { 
private: 
    int nVal; 
public: 
    void Fun() 
    { 
     cout << "A::Fun" << endl; 
    } 
    void Do() 
    { 
     cout << "A::Do" << endl; 
    } 
}; 
class B :public A { 
public: 
    virtual void Do() 
    { 
     cout << "B::Do" << endl; 
    } 
}; 
class C :public B { 
public: 
    void Do() 
    { 
     cout << "C::Do" << endl; 
    } 
    void Fun() 
    { 
     cout << "C::Fun" << endl; 
    } 
}; 
void Call(B& p) 

{ 
    p.Fun(); p.Do(); 
} 
int main() { 
    C c; Call(c); 
    return 0; 
} 

In dem obigen Code, um eine Basisklasse Bezug auf eine abgeleitete Klasse ankündigt, ist die AusgabeC++ Polymorphismus, über

A::Fun 

C::Do 

Aber ich kann es nicht verstehen. in dem Funktionsaufruf (B & p), sollte die Referenz P c von C-Klasse beziehen, warum der Ausgang

C::Fun 

C::Do 

Wenn ankündigen aa Basisklasse Bezugnahme auf eine abgeleitete Klasse nicht

ist, die unterschiedliche Basisklasse Sinn machen?

+1

Sie müssen die Funktionen in der Basisklasse virtuell machen. –

Antwort

2

Das Problem ist, dass A::Fun nicht als virtual markiert ist, daher wird C::Fun zur Laufzeit nicht gefunden. Sie sollten es als solche markieren:

class A { 
private: 
    int nVal; 
public: 
    virtual void Fun() 
    { 
     cout << "A::Fun" << endl; 
    } 
// ... 

wandbox example


Dies ist ein großartiges Beispiel für einen Fehler, die bei der Kompilierung-Zeit dank der override specifier gefangen werden konnte:

class C :public B { 
public: 
    void Do() override 
    { 
     cout << "C::Do" << endl; 
    } 
    void Fun() override 
    { 
     cout << "C::Fun" << endl; 
    } 
}; 

Würde drucken:

error: 'void C::Fun()' marked 'override', but does not override 
    void Fun() override 
      ^~~ 

+0

Vielen Dank! Ich habe festgestellt, dass ich den Klassenbezug vorher nicht wirklich verstanden habe. Wenn "B & p", wird dies zuerst in B schauen und dann in A schauen und feststellen, dass A Spaß hat(), aber es ist nicht virtuell. Also nennt es direkt fun() von A. Ist das richtig? – user7487638