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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:10:56