多态性和运算符重载是否混合在一起?没有指针就不能做多态性,正如这个答案中所解释的那样,你也不能像这里所解释的那样用指针进行运算符重载。
所以真的没有办法做到这一点,对吧?
问问题
10516 次
3 回答
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;
}
我并不是在暗示这是一个好主意,或者它是实用的。这只是可能的。
于 2012-06-29T08:50:17.647 回答
4
简单来说:
运算符重载是一种静态多态性。
静态多态可以使用函数重载、运算符重载和template
s 来实现。
我认为您只考虑动态多态性(virtual
东西)。
另一方面,通常我们看不到virtual
重载运算符的函数,但理论上它仍然是可能的。
更正:运行时(动态)多态性可以使用指针和引用来完成。
于 2012-06-29T08:47:44.150 回答
3
首先,多态性适用于引用和指针。运算符重载适用于引用。所以在那个层面上没有问题。
二元运算符存在潜在问题。对运算符多态性的直接语言支持仅适用于左侧操作数。至于诸如 binary 之类的东西+
,从逻辑上讲,人们会期望双重分派。虽然这可以实现,但它有点复杂,特别是如果层次结构是开放的。
对于像 binary+
这样通常返回一个新对象的运算符,还有返回类型的问题。通常,这不能是引用,因为没有合适类型的对象可以引用。已经开发了诸如字母信封习语之类的模式来处理这个问题,但它们不一定简单,而且它们通常具有非常显着的运行时开销。 或者重载的运算符返回一个特殊的类型,它只保存它的参数,并且知道如何在请求时以正确的类型计算值。
于 2012-06-29T10:11:19.257 回答