2016-03-25 10 views
0

Wenn eine virtuelle Methode über einen Basiszeiger oder eine Basisreferenz aufgerufen wird, die auf ein abgeleitetes Klassenobjekt verweist, wird zuerst die Basismethode und dann die abgeleitete Methode aufgerufen wird aufgerufen. Könnte jemand erklären, warum dieses Verhalten implementiert wird, anstatt die abgeleitete Klassenmethode direkt aufzurufen?C++ - Vererbung: Virtuelle Methoden der Basis werden zuerst aufgerufen, dann wird die abgeleitete Methode aufgerufen

Klasse Eltern

class Parent{ 
    private: 
     int money; 
    public: 
     void set_money(const int& m){ 
      money = m; 
     } 

     virtual const int& get_money() const{ 
      std::cout << "Parent version\n"; 
      return money; 
     } 
}; 

Klasse Child

class Child : public Parent{ 
    private: 
    int my_money; 
    mutable int family_money; 
    public: 
     void set_money(const int& m){ 
      my_money = m; 
     } 

     const int& get_money() const{ 
      family_money = my_money + Parent::get_money(); 
      std::cout << "Child version\n"; 
      return family_money; 
     } 

     void set_parent_money(const int& m){ 
      Parent::set_money(m); 
     } 
}; 

Haupt

int main(){ 
    Child c; 
    c.set_parent_money(20); 
    c.set_money(50); 
    Parent *p = &c; 
    cout << "Pointer " << p->get_money() << endl; 
    Parent& pr = c; 
    cout << "Reference " << pr.get_money() << endl; 
    Parent po = c; 
    cout << "Object " << po.get_money() << endl; 
    return 0; 
} 

Ausgabe

Parent version 
Child version 
Pointer 70 
Parent version 
Child version 
Reference 70 
Parent version 
Object 20 
+2

Sie rufen Eltern get_money in Kind get_money. – hank

Antwort

1

Nein, es ist in der richtigen Reihenfolge aufgerufen. Das einzige Problem ist, dass Sie zuerst Parent Methode von Child Methode aufrufen und danach drucken Sie Child Nachricht. Wenn Sie die beiden Zeilen austauschen, werden die Nachrichten wie erwartet angezeigt:

 ... 
     std::cout << "Child version\n"; 
     family_money = my_money + Parent::get_money(); 
     ....