【发布时间】:2012-06-29 08:43:04
【问题描述】:
多态性和运算符重载是否混合在一起?
正如this answer 中所解释的那样,没有指针就无法进行多态性,并且您也不能像here 中所解释的那样使用指针进行运算符重载。
所以真的没有办法做到这一点,对吧?
【问题讨论】:
标签: c++ polymorphism operator-overloading
多态性和运算符重载是否混合在一起?
正如this answer 中所解释的那样,没有指针就无法进行多态性,并且您也不能像here 中所解释的那样使用指针进行运算符重载。
所以真的没有办法做到这一点,对吧?
【问题讨论】:
标签: c++ polymorphism operator-overloading
是的,有。您没有正确阅读答案。
这是一个简短的演示:
#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;
}
我并不是暗示这是一个好主意,或者说它很实用。这只是可能的。
【讨论】:
简而言之:
运算符重载是一种静态多态性。
可以使用函数重载、运算符重载和templates 来实现静态多态性。
我认为您只考虑动态多态性(virtual 的东西)。
另一方面,通常我们看不到重载运算符的virtual 函数,但理论上它仍然是可能的。
更正:运行时(动态)多态性可以使用指针和引用来完成。
【讨论】:
首先,多态性适用于引用和指针。和 运算符重载适用于引用。所以没有问题 那个级别。
二元运算符存在潜在问题。直接语言
对运算符多态性的支持仅适用于左手
操作数。至于像二进制+ 这样的东西,从逻辑上讲
期待双重调度。虽然这可以实现,但它有点
更复杂,尤其是在层次结构开放的情况下。
对于像二进制 + 这样通常返回一个新对象的运算符,有
也是返回类型的问题。通常,这个不能是
引用,因为没有合适类型的对象可以引用
到。已经开发了诸如字母信封成语之类的模式来处理
有了这个,但它们并不一定简单,而且它们通常具有非常
显着的运行时开销。 或者重载的操作符返回一个
特殊类型,它只保存它的参数,并且知道如何计算
请求时具有正确类型的值。
【讨论】: