C++继承中的拷贝构造
拷贝构造
1、为什么重写拷贝构造?
拷贝分为两种,浅拷贝和深拷贝,对于栈上的数据,不需要进行重写,对于堆上的数据成员,不重写拷贝构造,就会造成重析构,即两个对象指的是同一个内存地址,那么在delete时就会析构两次,这是不允许的。
2、子类与父类写拷贝构造器后,只会调用子类的拷贝构造,那么会导致数据异常,按理来说,本应该调用各自的拷贝构造器才对。
3、解决方法
在子类的拷贝构造的初始化列表对分类的拷贝构造进行初始化。
父类:
class A
{
public:
A()
{
cout << "A()" << endl;
}
A(const A& another) //父类的拷贝构造
{
cout << "A(const A& another)" << endl;
}
};
子类
class B :public A
{
public:
B()
{
cout << "B()" << endl;
}
B(const B& another):A(another) //初始化列表对父类的拷贝构造进行初始化
{
cout << "B(const B& another)" << endl;
}
private:
};
运行结果:
内嵌子对象C
class C
{
public:
C()
{
cout << "C()" << endl;
}
C(const C& another)
{
cout << "C(const C& another)" << endl;
}
};
子类B
class B :public A
{
public:
B()
{
cout << "B()" << endl;
}
B(const B& another):A(another),c(another.c)//这里是对内嵌子对象的初始化,必须加上
{
cout << "B(const B& another)" << endl;
}
private:
C c;
};
运行结果: