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

C++抽象类与派生类operator=重载:实现深拷贝并保持对象独立

问题分析与解决方案

核心问题

  1. 基类operator=实现错误:原代码中调用this->~Employee()会直接销毁当前对象的成员,后续对name的操作属于访问已销毁对象,触发未定义行为,同时会错误销毁派生类的成员。
  2. 派生类未正确重写虚赋值运算符:基类的operator=是虚函数,但派生类的operator=参数为const productEmployee&,不符合虚函数重写的参数匹配规则,导致基类指针调用时只会触发基类的operator=,派生类的product成员无法被正确拷贝,深拷贝不完整。

修改方案

1. 修正基类Employee的operator=实现

Employee& Employee::operator = (const Employee& temp) {
    if (this != &temp) {
        // 先释放已有的name内存,避免内存泄漏
        delete[] name;
        // 重新分配内存并拷贝name内容
        name = new char[100]();
        strcpy_s(name, 100, temp.name);
    }
    return *this;
}

2. 修正派生类productEmployee的operator=,正确重写虚函数

先修改类声明中的operator=签名,使其匹配基类虚函数的参数类型,再完成派生类成员的拷贝:

// 类声明部分
class productEmployee:public Employee{
protected:
 int product;
public:
 productEmployee();
 virtual ~productEmployee();
 float getSalary();
 // 修正参数类型,匹配基类虚函数,添加override明确重写
 virtual productEmployee& operator = (const Employee& temp) override;
};

// 实现部分
productEmployee& productEmployee::operator = (const Employee& temp) {
    if (this != &temp) {
        // 调用基类赋值运算符完成基类成员的深拷贝
        Employee::operator=(temp);
        // 检查赋值对象是否为productEmployee类型
        const productEmployee* derivedTemp = dynamic_cast<const productEmployee*>(&temp);
        if (derivedTemp != nullptr) {
            // 拷贝派生类专属成员
            product = derivedTemp->product;
        }
        // 可选:类型不匹配时可抛出std::bad_cast异常,确保类型安全
    }
    return *this;
}

3. 效果说明

修改后,执行*t2 = *t1时会正确触发派生类的operator=:

  • 基类的name成员完成深拷贝,两个对象的name内存地址不同;
  • 派生类的product成员被正确拷贝;
  • t1和t2的指针地址保持独立,不会出现混淆或内存泄漏问题。

内容的提问来源于stack exchange,提问作者NamNguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:00:30