C++抽象类Student的operator==重载后子类对比报错问题求助
问题原因梳理
两个异常现象的原因分别是:
std1 == std2输出0:你比较的是两个指针变量存储的内存地址,grad1和grad2是两个独立的栈对象,地址天然不同,所以输出0。如果要比较对象的内容,必须对指针解引用后比较,也就是你写的*std1 == *std2。*std1 == *std2报运算符不匹配错误:你在student.cpp中定义的全局operator==没有在student.h头文件中声明,编译main.cpp时编译器只识别到Student类的定义,找不到对应运算符的实现声明,因此报错。
解决思路
你不需要必须把operator==重载为类的成员函数,但是需要做如下调整:
1. 补全运算符声明并设置友元
因为operator==需要访问Student类的protected成员,建议声明为类的友元,同时将声明放到头文件中让所有引用头文件的代码可见:
// student.h中Student类内部添加 class Student { // 原有成员不变 friend bool operator==(const Student& x, const Student& y); protected: virtual bool isEqual(const Student& other) const = 0; }; // 类定义之后补充全局运算符声明 bool operator==(const Student& x, const Student& y);
2. 基于虚函数实现多态比较逻辑
为了避免后续新增子类时频繁修改全局运算符的代码,用虚函数拆分各个子类的比较逻辑:
- 全局
operator==只负责校验类型一致性,类型相同的情况下调用虚比较函数:
// student.cpp中的实现 bool operator == (const Student& x, const Student& y) { if (typeid(x) != typeid(y)) return false; return x.isEqual(y); }
- 每个子类单独实现自己的
isEqual逻辑,比如Grad_Student:
bool Grad_Student::isEqual(const Student& other) const { // 全局运算符已经保证类型一致,直接static_cast即可 const Grad_Student& o = static_cast<const Grad_Student&>(other); return Name == o.Name && Stu_num == o.Stu_num && Lab == o.Lab; }
Undergrad_Student同理实现自己的isEqual,比较Name、Stu_num和Major即可。
注意事项
typeid对多态类型生效的前提是类至少有一个虚函数,你当前代码已经有纯虚函数print,满足要求。- 不要用
dynamic_cast做类型判断,typeid的判断已经保证两个对象类型完全一致,用static_cast性能更高且安全。
内容的提问来源于stack exchange,提问作者gun bos
相关产品推荐
相关产品推荐

