C++继承关系下如何实现深拷贝?基类和派生类都要定义拷贝构造函数吗
关于C++继承场景下的深拷贝实现解答
是否需要基类和派生类都定义拷贝构造函数
是的,你当前的场景必须分别定义,不过你代码里派生类拷贝构造的初始化列表存在语法错误,正确写法应该是:
MyFriendDetailInfo(const MyFriendDetailInfo ©) : MyFriendInfo(copy) // 直接传入派生类对象即可,会自动匹配基类的拷贝构造 { // 派生类自有成员的深拷贝逻辑 }
原因如下:
- 基类
MyFriendInfo中使用了堆分配的char* name,编译器默认生成的拷贝构造是浅拷贝,只会复制指针地址,会导致两个对象指向同一块堆内存,析构时出现重复释放的问题,因此基类必须自行实现深拷贝构造。 - 派生类
MyFriendDetailInfo除了自己新增的堆成员addr、phone需要做深拷贝外,还需要主动在初始化列表调用基类的拷贝构造,完成继承自基类的成员的深拷贝;如果不主动调用,编译器会默认调用基类的无参构造,导致基类部分的成员值异常。 - 补充提醒:既然你自定义了析构函数,还要遵循C++的三五法则,补充实现拷贝赋值运算符
operator=,否则类对象赋值时还是会触发浅拷贝问题。
其他深拷贝实现方案
- 最推荐的方案:用RAII类型代替裸指针
把char*全部替换成std::string,你不需要手写任何拷贝构造、析构函数,编译器自动生成的默认函数就会自动完成深拷贝,完全避免手动管理内存的bug,简化示例如下:
#include <string> class MyFriendInfo { private: std::string name; int age; public: MyFriendInfo(std::string xname, int xage) : name(std::move(xname)), age(xage) {} // 不需要自定义拷贝构造、析构,编译器生成的默认版本完全可用 };
- 多态场景深拷贝方案:实现虚clone函数
如果你需要在基类指针指向派生类对象的场景下完成深拷贝,可以在基类声明虚clone函数,每个派生类自行实现:
// 基类内声明 virtual MyFriendInfo* clone() const = 0; // 派生类内实现 MyFriendDetailInfo* clone() const override { return new MyFriendDetailInfo(*this); }
调用时直接通过基类指针调用clone()就能得到完整的派生类深拷贝对象。
内容的提问来源于stack exchange,提问作者Whistle1088
相关产品推荐
相关产品推荐

