C++ 如何在派生类中声明复制构造函数,而在基类中没有默认构造函数?

C++ 如何在派生类中声明复制构造函数,而在基类中没有默认构造函数?,c++,inheritance,copy-constructor,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:

请看以下示例:

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; }
};
类基
{
受保护的:
国际货币价值;
公众:
基本值(整数nValue)
:m_nValue(nValue)
{
}
const char*GetName(){return“Base”;}
int GetValue(){返回m_nValue;}
};
派生类:公共基
{
公众:
派生(int值)
:基本值(nValue)
{
}
派生(常数基和d){
std::cout您可以(也应该)调用基类的copy-ctor,如:

Derived( const Derived &d ) :
        Base(d)
{
    std::cout << "copy constructor\n";
}
派生(常量派生&d):
基地(d)
{
std::cout调用基的复制构造函数(由编译器生成):

Derived( const Derived &d ) : Base(d)
{            //^^^^^^^ change this to Derived. Your code is using Base
    std::cout << "copy constructor\n";
}
派生(常量派生&d):基(d)
{/^^^^^^将此更改为派生。您的代码正在使用Base

std::cout如果没有为类类型(struct、class或union)提供任何类型的用户声明构造函数,编译器将始终将默认构造函数和副本构造函数声明为其类的非显式内联公共成员

如果存在一些用户声明的构造函数,用户仍然可以强制编译器自动生成默认构造函数,否则将使用关键字default隐式声明默认构造函数

在基本构造函数中,有用户声明的构造函数,因此必须使用关键字default声明其他构造函数

class Base
{
protected:
    int m_nValue;

public:
    Base(const Base&) = default;    // since cpp11

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

    const char* GetName() { return "Base"; }
    int GetValue() { return m_nValue; }
};
在派生构造函数中,必须构造基本构造函数,如:

Derived(const Base &d)
: Base(d)
{
    std::cout << "copy constructor\n";
}
派生(常量基&d)
:基底(d)
{

一旦我们有了任何参数化构造函数,std::cout编译器就不会为类提供默认构造函数。
Base(Base const&)
是。由编译器完成的。@amit:当然是。除非您自己定义了一个复制构造函数,否则编译器会为您合成一个。@Plasmah:您应该在回答中明确提到它,我完全忘记了:\@amit:还有很多其他基本的东西在回答中没有明确提到,因为它们与t无关o这个问题,要么我解释全部,要么一个也没有。我认为这里没有比这更有用的了。@amit:
Base(Base const&)
将由编译器生成!@amit:当然是。除非您自己定义一个复制因子,否则编译器将为您合成一个。这似乎不会对现有的八年答案添加任何内容;它也不会更正复制因子参数