C++能否通过接口中重载的运算符调用子类实现的IsEqual方法?
这种实现方式可行且属于良好编程实践
你的思路完全没问题,这种把通用运算符逻辑抽离到模板基类、让子类仅实现核心判断方法的做法,是符合DRY(Don't Repeat Yourself)原则的优秀实践,相比之前每个子类重复写运算符的方式,优势很明显:
核心好处
- 彻底消除冗余代码:所有子类的
==和!=逻辑本质都是基于IsEqual,把这部分通用逻辑放在基类,不用在每个子类里重复实现,后续要修改运算符逻辑(比如加日志、额外校验),只需要改基类一处即可。 - 强制子类实现核心逻辑:
IsEqual是纯虚函数,编译器会强制每个继承的子类必须实现自己的相等判断逻辑,避免漏写导致的未定义行为。
需要优化的细节
有个小细节可以改进,提升代码性能:
当前IsEqual和运算符的参数用了值传递const T b,对于类对象来说,值传递会触发拷贝构造函数,尤其当对象较大时,会带来不必要的性能开销。建议改成const引用传递:
修正后的基类代码:
template <class T> class IEqualCompare { public: virtual bool IsEqual(const T& b) = 0; bool operator== (const T& b) { return this->IsEqual(b); } bool operator!= (const T& b) { return !(this->IsEqual(b)); } };
对应的子类实现也要同步修改:
class Dimentions : IEqualCompare<Dimentions> { // ... bool IsEqual(const Dimentions& b) { /* 你的相等判断逻辑 */ } // ... };
对比旧实现的优势
之前你把运算符定义为虚函数让子类实现的方式,会导致大量重复代码——每个子类都要写几乎完全一样的operator==和operator!=,只是调用自己的IsEqual。现在的基类封装方式,把通用逻辑收拢,代码更简洁、可维护性更强,完全是更优的选择。
内容的提问来源于stack exchange,提问作者PsychoBoo
相关产品推荐
相关产品推荐

