多态性和运算符重载是否混合在一起?
你不能在没有指针的情况下做多态,因为它在this answer中有解释,你也不能像指针here那样使用指针进行运算符重载。
所以真的没办法做到这一点,对吗?
答案 0 :(得分:7)
是的。你没有正确阅读答案。
这是一个简短的演示:
#include <iostream>
using namespace std;
struct X
{
int value;
virtual void operator += (int x)
{
value += x;
}
};
struct Y : X
{
virtual void operator += (int x)
{
value *= x;
}
};
void do_stuff(X& x)
{
x += 10;
cout << "Final value " << x.value << endl;
}
int main()
{
X x;
x.value = 10;
Y y;
y.value = 10;
do_stuff(x);
do_stuff(y);
return 0;
}
我并不是说这是个好主意,或者说它很实用。这只是可能的。
答案 1 :(得分:3)
简而言之:
运算符重载是 static 多态。
可以使用函数重载,运算符重载和template
来实现静态多态。
我认为你只考虑动态多态(virtual
东西)
另一方面,通常我们看不到重载运算符的virtual
函数,但仍然可能是理论上的。
更正:运行时(动态)多态可以使用指针和引用完成。
答案 2 :(得分:2)
首先,多态性适用于引用和指针。和 运算符重载与引用一起工作。所以没有问题 那个级别。
二元运算符存在潜在问题。直接语言
对运算符的多态性的支持仅适用于左侧
操作数。对于像二进制+
这样的东西,逻辑上就是这样
期待双重派遣。虽然这可以实现,但它有点
更复杂,特别是如果层次结构是开放的。
对于像二进制+
这样的运算符,通常会返回一个新对象
也是返回类型的问题。通常,此不能
引用,因为没有对象具有适当的类型来引用
至。已经开发出类似于信封成语的模式来处理
有了它,但它们不一定简单,而且它们经常非常简单
显着的运行时开销。 或重载运算符返回一个
特殊类型,只保存其参数,并知道如何计算
请求时具有正确类型的值。