C.87:基底クラスで==の用心
C.87:注意基本クラスの等価演算子
理由(理由)
階層の確実なかつ有用==を書くことは本当に難しいです。
書き込みシンプルかつ均等相続システムの演算子を使用して簡単には本当に難しいです。
例えば、悪い(陰性試料)
class B {
string name;
int number;
virtual bool operator==(const B& a) const
{
return name == a.name && number == a.number;
}
// ...
};
Bの比較は、2番目のオペランドの変換を受け入れますが、その最初ではありません。
第二オペランド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
もちろんそこ階層に==仕事を作る方法がありますが、素朴なアプローチはないスケールを行います
もちろん、同じ比較演算子の継承階層のアクションではなく、簡単な方法を作成する方法があります。
Note(注意)
このルールは、すべての通常の比較演算子に適用されます!=、<、<=、>、および> =。
このルールは、すべての一般的な比較演算子に適用される:! =、<、<=、>、そして> =。
施行(提案)
-
フラグ仮想オペレータ==()。他の比較演算子のために同じ:!=、<、<=、>、および> =。
-
先端の不等式は、仮想関数として定義され、他の比較は同じである:=、<、<=、>、および> =!
説明リンク
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c87-beware-of--on-base-classes
私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。
より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]