c++ - 使用 bool operator== 比较对象

标签 c++ inheritance operator-overloading

所以,看了一些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

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

最后一点,如果比较可以完全通过公共(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/

相关文章:

c++ - 这是什么意思?

c++ - 多种类型的部分类模板特化

c++ - 尝试使用 conan 安装 gtest 时出现 HTTPSConnectionPool 错误

C++:初始化 2 个对象 -> 输出不符合预期

c++ - 使用模板继承影子继承成员

c# - 从父类调用重写的虚方法

Swift 从父类(super class)调用子类的重写方法

C++ 使用类作为变量

c++ - 如何在运行时将编辑样式更改为 ES_NUMBER?

c++ - 有没有办法为 std::map 中小于给定键的第一个元素找到反向迭代器?