您的位置 首页 > 腾讯云社区

C++核心准则C.87:小心基类的相等运算符---面向对象思考

C.87: Beware of == on base classes

C.87:小心基类的相等运算符

Reason(原因)

It is really hard to write a foolproof and useful == for a hierarchy.

为继承体系写出简单又好用的相等运算符真的很难。

Example, bad(反面示例)

class B { string name; int number; virtual bool operator==(const B& a) const { return name == a.name && number == a.number; } // ... };

B's comparison accepts conversions for its second operand, but not its first.

B的相等比较运算符的第二个操作数接受类型转换,但是第一个不行。

class D :B { char character; virtual bool operator==(const D& a) const { return name == a.name && number == a.number && character == a.character; } // ... }; B b = ... D d = ... b == d; // compares name and number, ignores d's character d == b; // error: no == defined D d2; d == d2; // compares name, number, and character B& b2 = d2; b2 == d; // compares name and number, ignores d2's and d's character

Of course there are ways of making == work in a hierarchy, but the naive approaches do not scale

当然有办法让相等比较运算符在继承体系中动作,但是简单的方法不行。

Note(注意)

This rule applies to all the usual comparison operators: !=, <, <=, >, and >=.

本规则适用于所有的常见比较运算符:!=, <, <=, >, 和 >=。

Enforcement(实施建议)

Flag a virtual operator==(); same for other comparison operators: !=, <, <=, >, and >=.提示被定义为虚函数的相等比较运算符;其他比较运算符也一样:!=, <, <=, >, 和 >=。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c87-beware-of--on-base-classes

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

---来自腾讯云社区的---面向对象思考

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: