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 Base或Derived通过继承(转换运算符或转换构造函数)之外的某种机制.如果您不关心这些情况,那么成员平等就没问题了.
最后要注意的是,如果比较完全可以通过公共接口完成,我们(几乎)总是喜欢非成员,非朋友的功能,无论它是否是运营商.
EDIT2(非会员,非朋友非常快速的概述):
例如,假设您的类具有公共key方法,并且如果两个实例的键相等,则您希望将对象调用为相等.然后,在不使用朋友或成员相等运算符的情况下,您可以编写单独的等式:
bool operator==(const MyType& left, const MyType& right)
{
return left.key() == right.key();
}
Run Code Online (Sandbox Code Playgroud)
使用成员函数本身并没有什么不对,但是自由函数更通用.成员函数被强制使左侧操作数是类型BaseClass或子类型,而自由函数接受任何可隐式转换的BaseClass类型,而不仅仅是属于继承树的类型.
| 归档时间: |
|
| 查看次数: |
6022 次 |
| 最近记录: |