3

C ++で基本型をより派生した型と比較する場合operator==、基本型の部分のみを比較する必要がありますか、それともより派生した型で渡された場合はfalseを返す必要がありますか?

例えば

BaseType myBase("a", "b");
DerivedType myDerived("a", "b", "c");

myDerived == myBase // This should return false, right ?
myBase == myDerived // Should this return false as well ? How can the BaseType operator know that it's parameter is derived ?

operator==両方のステートメントが false を返す必要があるように感じますが、基本型の を実装する方法がわかりません。

4

1 に答える 1

0

ポリモーフィックな等価性について質問しているため、 のパブリック インターフェイスを介してポリモーフィックに比較することだけが理にかなっていますBaseType。例えば:

struct BaseType
{
  virtual int foo() const { return 42; }
};

struct DerivedType : BaseType
{
  virtual int foo() const { return i_; }
  explicit DerivedType(int i) : i_(i) {}
 private:
  int i_;
};

bool operator==(const BaseType& lhs, const BaseType& rhs)
{
  return lhs.foo() == rhs.foo();
}

int main()
{
  BaseType b;
  DerivedType d(13);
  std::cout << std::boolalpha;
  std::cout << (b == d) << std::endl;
}

これを実装するにはさまざまな方法がありますが、基本的な考え方は、等価演算子がオペランドの仮想パブリック インターフェイスを使用することです。ただし、パブリック インターフェイスは、メンバー関数などを介して多くのロジックを隠すことができます。

bool equals(const BaseType& other) const
{
  // Call virtual methods to determine equality.
  // These can be public, private or protected.
}

次に、非メンバー オペレーターがこれを呼び出します。

bool operator==(const BaseType& lhs, const BaseType& rhs)
{
  return lhs.equals(rhs);
}
于 2013-06-25T10:38:06.520 に答える