使用bool运算符==比较对象

Dmi*_*ryM 11 c++ inheritance operator-overloading

因此,在阅读了一些SO问题和答案之后,我仍然不明白为什么要使用

friend bool operator==( BaseClass const &left, BaseClass const &right )
Run Code Online (Sandbox Code Playgroud)

代替

bool operator==( BaseClass const &right )
Run Code Online (Sandbox Code Playgroud)

现在我有这样的东西http://pastebin.com/pKsTabC0 (固定) - 它似乎工作正常.但也许我错过了什么?有什么建议?

更新1

好的,我更改了源代码以使其正常工作http://ideone.com/fIAmB.删除了不必要的虚拟和添加的const.我还是不明白为什么要用朋友...

Mar*_*k B 10

派生函数与父运算符的签名不同,因此它隐藏了父对象而不是覆盖它.这意味着你无论如何都无法使用虚拟对象,因为左手参数的静态类型决定了被调用的函数.

这就是为什么虚拟比较的常规方法是一个非成员相等运算符,它分派给基类中的虚拟比较函数.

请考虑您对虚拟比较的特定需求,因为它可能是一种设计气味,您可以使用替代设计.

还要注意成员比较(在这种情况下是相等的)运算符通常应该是const.

编辑:似乎你可能只关心基于左手参数的静态类型的比较,这应该是一个更容易的问题.在这种情况下,您的代码处理所有情况,除非左手参数是一个类型隐式转换为a BaseDerived通过继承(转换运算符或转换构造函数)之外的某种机制.如果您不关心这些情况,那么成员平等就没问题了.

最后要注意的是,如果比较完全可以通过公共接口完成,我们(几乎)总是喜欢非成员,非朋友的功能,无论它是否是运营商.

EDIT2(非会员,非朋友非常快速的概述):

例如,假设您的类具有公共key方法,并且如果两个实例的键相等,则您希望将对象调用为相等.然后,在不使用朋友或成员相等运算符的情况下,您可以编写单独的等式:

bool operator==(const MyType& left, const MyType& right)
{
    return left.key() == right.key();
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*nta 7

使用成员函数本身并没有什么不对,但是自由函数更通用.成员函数被强制使左侧操作数是类型BaseClass或子类型,而自由函数接受任何可隐式转换的BaseClass类型,而不仅仅是属于继承树的类型.