2017-12-15 16 views
0

このコードの出力結果は "BASE!"になります。この例では、派生クラスのコピー機能が呼び出されなかったのはなぜですか。彼らには同じ署名があり、私の推論では派生したものが呼び出されるべきです。何が問題ですか?コピーコンストラクタの仮想ヘルパ関数が呼び出されない

#include <iostream> 
using namespace std; 

class Base{ 
    virtual void copy(const Base&b){ 
     cout<<"BASE!"; 
    } 
public: 
    Base()=default; 
    Base(const Base&b){ 
     copy(b); 
    } 
}; 

class Derived: public Base{ 
    void copy(const Base&b) override{ 
     cout<<"DERIVED"; 
    } 
}; 

int main() { 
    Derived d; 
    Derived b(d); 
    return 0; 
} 
+0

あなたは基本 –

+3

の可能性のある二重にコピーメソッドを作成する必要があります(https://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors)の – HolyBlackCat

+0

可能な複製を[コンストラクタ内の仮想関数を呼び出します] [コンストラクタから仮想関数と純粋仮想関数を呼び出す](https://stackoverflow.com/questions/8642363/invoking-virtual-function-and-pure-virtual-function-from-a-constructor) –

答えて

4

まだ存在しないため呼び出されません。

最初に基本クラスが構築されます。そのコピーコンストラクタは仮想メソッドを呼び出します。派生クラスは、基本クラスが最初に構築されるまで構築されないので、基本クラスの仮想クラスメソッドは何でも上書きされません。

派生クラスの構築が開始された場合のみ、仮想クラスメソッドは派生クラスによってオーバーライドされます。

派生クラスのインスタンスは、実際に構築されるまで存在せず、基本クラスが完全に構築されるまで構築されないため、基本クラスの構築中に仮想メソッドが何かによってオーバーライドされません。

+0

これは問題を解決しました、ありがとう!この問題を緩和する方法はありますか?不要なコードを使わずに派生クラスにコピーを(例えば、いくつかのコンテナの派生クラスを作成するとき)扱えるようにするのが良いでしょう。 –

+1

派生クラスは派生クラスのコピーコンストラクタを定義する必要があります。基本クラスのメソッドを呼び出すか、コードをリサイクルするために必要な作業を効率的に呼び出します。 –

関連する問題