C++抽象类继承场景下全局operator==运算符重载实现方法咨询
C++ 学生类相等运算符全局重载实现方案
第一步:修改头文件声明
因为全局operator==需要访问Student类的protected成员,首先调整student.h中的代码:
- 删除Student类中原有的成员
operator==声明 - 在Student类的public区域添加友元声明,授予全局运算符访问权限:
class Student { protected: string Name; int Stu_num; public: virtual void print() = 0; // 新增友元声明 friend bool operator==(const Student& x, const Student& y); // constructor... };
- 原有Grad_Student、Undergrad_Student的成员
operator==可以保留,不需要额外修改。
第二步:编写全局运算符实现
在student.cpp中添加如下实现,逻辑和你原有成员版本的运行效果完全兼容,同时优化了类型判断的兼容性:
bool operator==(const Student& x, const Student& y) { // 先判断两个对象的实际类型是否一致,比对比typeid.name()更跨编译器兼容 if (typeid(x) != typeid(y)) { return false; } // 对比基类公共属性 if (x.Name != y.Name || x.Stu_num != y.Stu_num) { return false; } // 向下转型后调用派生类的相等判断逻辑 if (const auto* grad_x = dynamic_cast<const Grad_Student*>(&x)) { const auto* grad_y = dynamic_cast<const Grad_Student*>(&y); return *grad_x == *grad_y; } else if (const auto* under_x = dynamic_cast<const Undergrad_Student*>(&x)) { const auto* under_y = dynamic_cast<const Undergrad_Student*>(&y); return *under_x == *under_y; } // 抽象类不会产生实例,此处为兜底逻辑 return false; }
可选优化建议
- 如果不想使用友元降低耦合,可以为三个类添加对应的getter方法访问内部属性,即可删除友元声明
- 如果你需要派生类的
operator==可以独立使用,可以在派生类的相等判断中也加上基类属性的对比,避免后续单独调用派生类==时逻辑不完整 - 现有实现完全兼容你原来的
Student *students[300]数组查找逻辑,不需要修改上层调用代码
内容的提问来源于stack exchange,提问作者gun bos
相关产品推荐
相关产品推荐

