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;