2016-03-25 26 views
0

Bir temel işaretçi veya türetilmiş bir sınıf nesnesini işaret eden bir temel başvuru yoluyla sanal bir yöntem çağrıldığında, temel yöntem önce ve sonra türetilmiş yöntem çağrılır. çağrılır. Birisi, türetilmiş sınıf yöntemini doğrudan çağırmak yerine bu davranışın neden uygulandığını açıklayabilir mi?C++ Kalıtım: İlk olarak temel yöntemlerin temel yöntemleri çağrılır ve daha sonra türetilen yöntem çağrılır.

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; 
     } 
}; 

sınıf Çocuk

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); 
     } 
}; 

ana sınıfı Veli

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; 
} 

Çıktı

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

Ebeveyn get_money alt öğesi get_money içinde diyorsunuz. – hank

cevap

1

Hayır, doğru sırada çağrılan. Tek sorun, ilk olarak Child yönteminden Parent yöntemini çağırmanız ve bundan sonra Child iletisini yazdırmanızdır. İki çizgiyi değiştirirseniz, iletiler beklediğiniz gibi görünecektir:

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