c+中的多态等式+; < >如果在C++中将基类型与一个派生类型比较,那么运算符==/COD>只比较基类型部分,还是如果它以更派生类型传递,则返回false吗?

c+中的多态等式+; < >如果在C++中将基类型与一个派生类型比较,那么运算符==/COD>只比较基类型部分,还是如果它以更派生类型传递,则返回false吗?,c++,polymorphism,equality,C++,Polymorphism,Equality,比如说 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

比如说

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,但我不确定如何为基类型实现
运算符==

既然您在询问多态性相等,那么通过
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 operator==(const BaseType& lhs, const BaseType& rhs)
{
  return lhs.equals(rhs);
}

如何实现这些操作符完全取决于您。但是,
BaseType
操作符无法检查
DerivedType
中的任何内容,因为基类通常不知道任何可能的派生类。当然,除非您将运算符实现为独立函数,并使用正确的参数来处理这两种类型。我不确定您所说的“将运算符实现为独立函数”是什么意思基本类型如何才能检查它与派生类型的差异?@WillemD'haeseleer如果需要检查类型是否不同,则不再使用多态性。如果foo()是hash_content(),具有合适的大返回类型,则实际上可以将其用于此目的
bool operator==(const BaseType& lhs, const BaseType& rhs)
{
  return lhs.equals(rhs);
}