Как объявить конструктор копирования в производном классе, без конструктора по умолчанию в базе? - PullRequest
13 голосов
/ 16 февраля 2012

Пожалуйста, посмотрите на следующий пример:

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.

Ответы [ 2 ]

17 голосов
/ 16 февраля 2012

Вызовите конструктор копирования (сгенерированный компилятором) базы:

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

И в идеале вы должны вызвать сгенерированный компилятором конструктор копии базы.Не думай о вызове другого конструктора.Я думаю, что это была бы плохая идея.

5 голосов
/ 16 февраля 2012

Вы можете (и должны) вызывать ctor копии базового класса, например:

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

Обратите внимание, что я превратил параметр Base в параметр Derived, поскольку только он называется ctor копирования.Но, может быть, вы на самом деле не хотели копировать ctor ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...