C ++操作符重载&多态性(c++ operator overloading & polymorph

2019-07-30 04:11发布

不要多态性和运算符重载混合在一起? 你不能这样做没有多态性指针,因为它是在解释这个答案 ,你也可以这样做运营商,超载的指针作为解释在这里 。
所以真的是没有办法做到这一点,对不对?

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