【发布时间】:2021-03-25 18:31:08
【问题描述】:
我们无法复制派生类对象,当基类的复制构造函数是私有的,但是当我们在派生类中编写自己的复制构造函数时,我们可以复制对象,为什么?
#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
}
看了cmets和answer后才明白这一点,我又写了一个程序
#include <iostream>
class base
{
protected:
int x;
int y;
public:
base() {}
base(int x, int y) : x(x), y(y)
{
}
};
class derived : public base
{
int a;
public:
derived()
{
}
derived(int a, int x, int y) : a(a), base(x, y){};
derived(derived const &x)
{
this->a = x.a;
}
void get()
{
std::cout << a;
std::cout << "\t" << x << "\t" << y;
}
};
int main()
{
derived a(99, 2, 3);
a.get();
derived b(a);
std::cout << std::endl;
b.get();
}
这给了我输出
99 2 3
99 -2145089504 1
我还发现 Why aren't copy constructors "chained" like default constructors and destructors? 值得一读
【问题讨论】:
-
您的构造函数
derived(const derived &X)默认调用base(),这是公共的,如果需要,您必须显式调用基类复制构造函数(因为它是私有的,所以会失败)。编译器生成的derived的复制构造函数调用base的复制构造函数,这是私有的,这就是它之前失败的原因。 -
@MartinYork 如果我删除它并使用编译器的复制构造函数会发生什么?
-
见上面的评论。
-
@MartinYork 谢谢伙计!!
-
在您的第二个代码块中,
get()例程在x和y未初始化时执行未定义行为。
标签: c++ copy-constructor