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 ?

我觉得这两个语句都应该返回 false,但我不确定如何实现operator==基类型。

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 回答