CppCoreGuidelines C.87 注意基类的 == 操作
22 November 2022
C.87: Beware of ==
on base classes
理由
在类层级中,我们很难写出万无一失的有用的==
操作。
例子
class B { string name; int number; public: virtual bool operator==(const B& a) const { return name == a.name && number == a.number; } // ... };
B
的比较操作会接受第二个参数的类型转换,但是其自身不做类型转换。
class B { string name; int number; public: virtual bool operator==(const B& a) const { return name == a.name && number == a.number; } // ... }; class D : public B { char character; public: virtual bool operator==(const D& a) const { return B::operator==(a) && character == a.character; } // ... }; int main() { B b = B(); D d = D(); cout << (b == d) << endl; // return b.name == d.name && b.number == d.number; // compares name and number, ignores d's character cout << (d == b) << endl; // return d.name == b.name && d.number == b.number; // compares name and number, ignores d's character D d2; cout << (d == d2) << endl; // return d.name == d2.name && d.number == d2.number // && d.character == d2.character // compares name, number, and character B& b2 = d2; cout << (b2 == d) << endl; // return b2.name == d.name && d2.number == d.number; // compares name and number, ignores d2's and d's character }
1 1 0 0
当然也有办法可以让==
在类层级中工作,但是不太具有扩展性。
注意
此规则应用与其他各种比较操作。
强化
标记virtual operator==()
以及其他各种比较操作符。 !=
, <
<=
, >
, >=
, <=>
.