4

多态性和运算符重载是否混合在一起?没有指针就不能做多态性,正如这个答案中所解释的那样,你也不能像这里所解释的那样用指针进行运算符重载。
所以真的没有办法做到这一点,对吧?

4

3 回答 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

简单来说:

运算符重载是一种静态多态性。

静态多态可以使用函数重载、运算符重载和templates 来实现。

我认为您只考虑动态多态性(virtual东西)。
另一方面,通常我们看不到virtual重载运算符的函数,但理论上它仍然是可能的。

更正:运行时(动态)多态性可以使用指针和引用来完成。

于 2012-06-29T08:47:44.150 回答
3

首先,多态性适用于引用和指针。运算符重载适用于引用。所以在那个层面上没有问题。

二元运算符存在潜在问题。对运算符多态性的直接语言支持仅适用于左侧操作数。至于诸如 binary 之类的东西+,从逻辑上讲,人们会期望双重分派。虽然这可以实现,但它有点复杂,特别是如果层次结构是开放的。

对于像 binary+这样通常返回一个新对象的运算符,还有返回类型的问题。通常,这不能是引用,因为没有合适类型的对象可以引用。已经开发了诸如字母信封习语之类的模式来处理这个问题,但它们不一定简单,而且它们通常具有非常显着的运行时开销。 或者重载的运算符返回一个特殊的类型,它只保存它的参数,并且知道如何在请求时以正确的类型计算值。

于 2012-06-29T10:11:19.257 回答