C++运算符重载和多态性

c++ operator overloading & polymorphism

本文关键字:多态性 重载 运算符 C++      更新时间:2023-10-16

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

是的,有。您没有正确阅读答案。

这是一个简短的演示:

#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;
}

我并不是说这是一个好主意,或者它是实用的。这简直是可能的。

简而言之:

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

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

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

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

首先,多态性同时适用于引用和指针。 和运算符重载适用于引用。 所以没有问题那个水平。

二元运算符存在潜在问题。 直接语言对运算符多态性的支持仅适用于左侧操作数。 至于像二进制+这样的东西,从逻辑上讲会期待双重调度。 虽然这可以实现,但它在某种程度上更复杂,尤其是在层次结构打开的情况下。

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