web-dev-qa-db-ja.com

ベースにデフォルトのコンストラクターを使用せずに、派生クラスでコピーコンストラクターを宣言するにはどうすればよいですか?

次の例をご覧ください。

class Base
{
protected:
    int m_nValue;

public:
    Base(int nValue)
        : m_nValue(nValue)
    {
    }

    const char* GetName() { return "Base"; }
    int GetValue() { return m_nValue; }
};

class Derived: public Base
{
public:
    Derived(int nValue)
        : Base(nValue)
    {
    }
    Derived( const Base &d ){
        std::cout << "copy constructor\n";
    }

    const char* GetName() { return "Derived"; }
    int GetValueDoubled() { return m_nValue * 2; }
};

このコードは、基本クラスのデフォルトのコンストラクターがないというエラーをスローし続けます。私がそれを宣言するとき、すべてが大丈夫です。しかし、私がそうしないと、コードは機能しません。

基本クラスでデフォルトコンストラクターを宣言せずに、派生クラスでコピーコンストラクターを宣言するにはどうすればよいですか?

Thnaks。

13

ベースのコピーコンストラクター(コンパイラーによって生成される)を呼び出します。

Derived( const Derived &d ) : Base(d)
{            //^^^^^^^ change this to Derived. Your code is using Base
    std::cout << "copy constructor\n";
}

そして理想的には、コンパイラが生成したベースのコピーコンストラクタを呼び出す必要があります。他のコンストラクターを呼び出すことを考えないでください。それは悪い考えだと思います。

18
Nawaz

次のように、基本クラスのコピーctorを呼び出すことができます(そして呼び出す必要があります)。

Derived( const Derived &d ) :
        Base(d)
{
    std::cout << "copy constructor\n";
}

BaseパラメーターをDerivedパラメーターに変更したことに注意してください。これは、それだけがコピーctorと呼ばれるためです。しかし、多分あなたは本当にコピーctorを望んでいませんでした...

5
PlasmaHH