c ++运算符重载&多态性

时间:2012-06-29 08:43:05

标签: c++ polymorphism operator-overloading

多态性和运算符重载是否混合在一起? 你不能在没有指针的情况下做多态,因为它在this answer中有解释,你也不能像指针here那样使用指针进行运算符重载。
所以真的没办法做到这一点,对吗?

3 个答案:

答案 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)

首先,多态性适用于引用和指针。和 运算符重载与引用一起工作。所以没有问题 那个级别。

二元运算符存在潜在问题。直接语言 对运算符的多态性的支持仅适用于左侧 操作数。对于像二进制+这样的东西,逻辑上就是这样 期待双重派遣。虽然这可以实现,但它有点 更复杂,特别是如果层次结构是开放的。

对于像二进制+这样的运算符,通常会返回一个新对象 也是返回类型的问题。通常,此不能 引用,因为没有对象具有适当的类型来引用 至。已经开发出类似于信封成语的模式来处理 有了它,但它们不一定简单,而且它们经常非常简单 显着的运行时开销。 重载运算符返回一个 特殊类型,只保存其参数,并知道如何计算 请求时具有正确类型的值。