クラス階層では、オブジェクトのカスタマイズ可能で正確な比較を保証するためにoperator==をオーバーロードすることが重要になります。ただし、正しいアプローチを決定するのは難しい場合があります。
無料関数は、operator== をオーバーロードするため、階層内のリーフ ノードを直接比較できます。ただし、このメソッドでは、派生クラスがキャストせずに基本クラスの比較ロジックを継承することを禁止します。
仮想メンバー関数は代替アプローチを提供しますが、キャストが必要であり、深くネストされた階層では面倒になる可能性があります。
Scott Meyer のEffective C アドバイスに触発された推奨手法は、次のことを提唱しています。手順:
このアプローチにより、次のことが保証されます。基本関数が保護されているため、異なる型間の比較は防止されます。ただし、リーフ クラスは、特定のデータ メンバーに対して親の比較ロジックを利用できます。
偶発的なフォールバック比較を防ぐために、抽象基本クラスでのoperator==の実装は避けてください。代わりに、派生クラスの Operator== 実装によってアクセスできる基本クラス内に、isEqual() などの (保護された) 非仮想ヘルパー関数を提供します。
動的比較が必要な場合は、基本クラスの純粋仮想関数を利用できます。純粋仮想関数は、派生クラスの演算子 == を参照して、具体的な派生クラスでオーバーライドできます。
以上がクラス階層でoperator==を効果的にオーバーロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。