Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我们将基类复制构造函数设为私有时会发生什么?_C++_Copy Constructor - Fatal编程技术网

C++ 当我们将基类复制构造函数设为私有时会发生什么?

C++ 当我们将基类复制构造函数设为私有时会发生什么?,c++,copy-constructor,C++,Copy Constructor,当基类的复制构造函数是私有的时,我们无法复制派生类对象,但当我们在派生类中编写自己的复制构造函数时,我们能够复制对象,为什么 #include <iostream> class base { public: base() { } private: base(const base &x) { std::cout << "copy constructor of base class";

当基类的复制构造函数是私有的时,我们无法复制派生类对象,但当我们在派生类中编写自己的复制构造函数时,我们能够复制对象,为什么

#include <iostream>
class base
{
public:
    base()
    {
    }

private:
    base(const base &x)
    {
        std::cout << "copy constructor of base class";
    }
};
class derived : public base
{
public:
    derived(){};
    derived(const derived &X)             //If we remove this, we are not able to create copy? But why?
    {
        std::cout << "copy of derived class";
    }
};

int main()
{
    derived x;
    derived y(x);//valid with our own derived class copy constructor 
}
我还发现值得一读

当基类的复制构造函数是私有的时,我们无法复制派生类对象


派生类copy的隐式复制构造函数初始化基。如果基的复制构造函数是私有的,则派生类无权访问它,并且无法复制基。如果显式定义不复制基的派生类复制构造函数,则没有问题-除了基被默认初始化的问题。

我认为您假设派生类的复制构造函数将调用基的复制构造函数,但事实并非如此,它调用构造函数。正如在评论中所说的,您需要显式调用复制构造函数来获得默认行为

此外,当基类复制构造函数是私有的时,编译器通过删除派生类的复制构造函数来维护默认行为

所以编译器将同时删除复制构造函数和赋值运算符

  // derived(const derived &) = delete;
  // derived(derived &&) = delete;


在您的例子中,您显式声明了复制构造函数,因此编译器永远不需要显式删除它们。

您的构造函数
派生(const-derived&X)
默认情况下调用
base()
它是公共的,如果您想要它,您必须显式调用基类复制构造函数(因为它是私有的,所以会失败)。编译器生成的
derived
的复制构造函数调用
base
的复制构造函数,该构造函数是私有的,这就是它以前失败的原因。@MartinYork如果我删除它并使用编译器的复制构造函数,会发生什么情况?请参阅上面的注释。@MartinYork谢谢Mate!!在第二个代码块中,
get()
例程在未初始化
x
y
时执行未定义的行为。
99      2       3
99      -2145089504     1
  // derived(const derived &) = delete;
  // derived(derived &&) = delete;