

c++の仮想関数について質問です。  
次のように非常に単純なBaseとそれを継承したDerivedを用意します。

[code]

    #include <iostream>
    
    struct Base {
    virtual void f()
    {
       std::cout << "Base" << std::endl;
    }
    };
    
    struct Derived : Base {
    void f() override
    {
        std::cout << "Derived" << std::endl;
    }
    };
    
    int main()
    {
      {
        Derived d;
        Base b = d;
    
        b.f();
      }
    
      {
        Derived d;
        Base& b = d;
    
        b.f();
      }
    }
    
[/code]

実行結果が、

[code]

    Base
    Derived
    
[/code]

となります。

なぜ前者ではBaseのf()が呼ばれてしまうのでしょうか。


CC BY-SA 3.0
2017-09-28T14:46:37.357
38273
2017-09-28T16:15:24.037
15334
question
c++ c++11
c++ 継承時の仮想関数の呼び出しについて

[code]

    Base b = d;
    
[/code]

の意味は、`Base`型のインスタンス`b`を新たに作成し、初期化の値として`d`を使う、ということです。つまり、`b`は`Base`そのものなので、`Base`の`f()`が呼ばれます。

[code]

    Base& b = d;
    
[/code]

は、`b`は参照型なので、中身は`d`です。なので`Derived`の`f()`が呼ばれます。


CC BY-SA 3.0
2017-09-28T16:15:24.037
38274
2017-09-28T16:15:24.037
3605
38273
answer