【问题标题】:c++ operator overloading & polymorphismc++ 运算符重载和多态性
【发布时间】:2012-06-29 08:43:04
【问题描述】:

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

【问题讨论】:

    标签: c++ polymorphism operator-overloading


    【解决方案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;
    }
    

    我并不是暗示这是一个好主意,或者说它很实用。这只是可能的。

    【讨论】:

      【解决方案2】:

      简而言之:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-15
          • 2012-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-07
          • 2016-02-19
          相关资源
          最近更新 更多