如何在派生类中声明复制构造函数,而不在基础中使用默认的construcor?

unr*_*nal 14 c++ inheritance copy-constructor

请看下面的例子:

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; }
};
Run Code Online (Sandbox Code Playgroud)

这段代码不断给我一个错误,即基类没有默认的构造函数.当我宣布一切都好的时候.但是当我不这样做时,代码不起作用.

如何在派生类中声明复制构造函数而不在基类中声明默认的构造函数?

Thnaks.

Naw*_*waz 18

调用base的copy-constructor(由编译器生成):

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

理想情况下,您应该调用编译器生成的基类的复制构造函数.不要想到调用其他构造函数.我认为那是个坏主意.

  • @amit:`Base(Base const&amp;)` 将由编译器生成! (2认同)
  • @amit:当然是.除非您自己定义副本,否则编译器将为您合成一个副本. (2认同)

Pla*_*aHH 6

您可以(并且应该)调用基类的副本ctor,例如:

Derived( const Derived &d ) :
        Base(d)
{
    std::cout << "copy constructor\n";
}
Run Code Online (Sandbox Code Playgroud)

请注意,我将Base参数转换为Derived参数,因为只有它被称为复制ctor.但也许你真的不想复制ctor ......