C++抽象类与派生类operator=重载:实现深拷贝并保持对象独立
问题分析与解决方案
核心问题
- 基类
operator=实现错误:原代码中调用this->~Employee()会直接销毁当前对象的成员,后续对name的操作属于访问已销毁对象,触发未定义行为,同时会错误销毁派生类的成员。 - 派生类未正确重写虚赋值运算符:基类的
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
相关产品推荐
相关产品推荐

