2016-03-25 6 views
0

Когда виртуальный метод вызывается базовым указателем или базовой ссылкой, указывающей на объект производного класса, сначала запускается базовый метод, а затем производный метод вызывается. Может ли кто-нибудь объяснить, почему это поведение реализовано вместо прямого вызова метода производного класса?C++ Inheritance: сначала инициируются виртуальные методы базы, а затем вызывается производный метод.

класс Parent

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

класс 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); 
     } 
}; 

главный

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

Выход

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

Вы вызываете родительский get_money внутри ребенка get_money. – hank

ответ

1

Нет, он вызывается в правильном порядке. Единственная проблема заключается в том, что вы сначала вызываете метод Parent от Child, и после этого вы печатаете сообщение Child. Если вы поменяете две строки, сообщения появятся так, как вы ожидаете:

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