所以,看了一些SO问答,还是不明白为什么要用
friend bool operator==( BaseClass const &left, BaseClass const &right )
代替
bool operator==( BaseClass const &right )
现在我有这样的东西http://pastebin.com/pKsTabC0 (已修复) - 它似乎工作正常。但也许我错过了什么?有什么建议吗?
更新 1
好的,我更改了源以使其正常工作http://ideone.com/fIAmB .删除了不必要的 virtual 并添加了 const。我仍然不明白为什么要使用 friend ...
最佳答案
您的派生函数没有与父运算符相同的签名,因此它隐藏父比较而不是覆盖它。这意味着您无论如何都无法使用虚函数,因为左侧参数的静态类型决定了调用的函数。
这就是为什么虚拟比较的普通方法是非成员相等运算符,它分派(dispatch)给基类中的虚拟比较函数。
请务必考虑您对虚拟比较的特定需求,因为这可能是一种设计味道,您可以使用替代设计。
另请注意,成员比较(在本例中为相等)运算符通常应为 const
。
编辑:看来您可能只关心基于左侧参数的静态类型的比较,这应该是一个更简单的问题。在这种情况下,您的代码会处理所有情况,除非左侧参数是通过继承以外的某种机制(转换运算符或转换构造函数)隐式转换为 Base
或 Derived
的类型).如果您不关心这些情况,那么成员平等就可以了。
最后一点,如果比较可以完全通过公共(public)接口(interface)完成,我们(几乎)总是更喜欢非成员、非友元函数,不管它是否是运算符。
EDIT2(非成员(member)、非好友的快速概览):
例如,假设您的类有一个公共(public)key
方法,如果两个实例的键相等,您希望调用对象相等。然后,在不使用 friend 或成员相等运算符的情况下,您可以独立编写相等:
bool operator==(const MyType& left, const MyType& right)
{
return left.key() == right.key();
}
关于c++ - 使用 bool operator== 比较对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11633059/