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);
}