2016-03-25 10 views
0

派生クラスオブジェクトを指すベースポインタまたはベース参照によって仮想メソッドが呼び出されると、まずベースメソッドが呼び出され、次に派生メソッドが呼び出されます。誰かが直接この派生クラスメソッドを呼び出すのではなく、この動作が実装されている理由を説明できますか?C++継承:まずベースの仮想メソッドが呼び出された後、派生メソッドが呼び出されます

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

クラス子

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メッセージを出力します。 2行をスワップすると、メッセージは期待通りに表示されます。

 ... 
     std::cout << "Child version\n"; 
     family_money = my_money + Parent::get_money(); 
     .... 
関連する問題