不要多态性和运算符重载混合在一起? 你不能这样做没有多态性指针,因为它是在解释这个答案 ,你也可以这样做运营商,超载的指针作为解释在这里 。
所以真的是没有办法做到这一点,对不对?
Answer 1:
就在这里。 你没有正确读取的答案。
这里是一个简短的演示:
#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;
}
我没有暗示这是一个好主意,或者说,它的实用性。 这仅仅只是可能。
Answer 2:
简而言之:
运算符重载是静态多态性。
静态多态性可以使用函数重载,运算符重载和实现template
秒。
我认为你正在考虑动态多态性( virtual
的东西)只。
在另一方面,通常我们没有看到virtual
重载操作符的功能,但它仍然是可能的theoritically。
校正:运行时(动态)的多态性可以用指针和引用来完成。
Answer 3:
首先,多态性可工作在引用和指针。 和运算符重载用引用作品。 因此,有在这一水平没有问题。
有二进制运营商的潜在问题。 对于多态性对运营商的直接语言支持仅适用于左手操作数。 凡为这样的事情二元+
,一个在逻辑上所期望的双重分派。 虽然这是可以实现的,这是较为复杂,尤其是在层次结构是开放的。
对于像二元运算+
,其通常返回一个新的对象,也有返回类型的问题。 典型地,这不可能是一个参考,因为不存在与一个适当的类型来指代没有对象。 像信信封成语模式已经发展到解决这个问题,但他们不一定是简单的,他们往往有非常显著运行时开销。 或者重载运算符返回一个特殊类型,它不仅节省了它的参数,并知道如何要求时计算正确类型值。
文章来源: c++ operator overloading & polymorphism