You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++继承关系下如何实现深拷贝?基类和派生类都要定义拷贝构造函数吗

关于C++继承场景下的深拷贝实现解答

是否需要基类和派生类都定义拷贝构造函数

是的,你当前的场景必须分别定义,不过你代码里派生类拷贝构造的初始化列表存在语法错误,正确写法应该是:

MyFriendDetailInfo(const MyFriendDetailInfo &copy) 
    : 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:24:00