C++运算符重载和多态性
c++ operator overloading & polymorphism
多态性和运算符重载是否混合在一起?没有指针就无法进行多态性,正如本答案中所解释的那样,您也不能使用指针进行运算符重载,如此处所述。
所以真的没有办法做到这一点,对吧?
是的,有。您没有正确阅读答案。
这是一个简短的演示:
#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
函数,但理论上仍然是可能的。
更正:运行时(动态)多态性可以使用指针和引用来完成。
首先,多态性同时适用于引用和指针。 和运算符重载适用于引用。 所以没有问题那个水平。
二元运算符存在潜在问题。 直接语言对运算符多态性的支持仅适用于左侧操作数。 至于像二进制+
这样的东西,从逻辑上讲会期待双重调度。 虽然这可以实现,但它在某种程度上更复杂,尤其是在层次结构打开的情况下。
对于像二进制+
这样的运算符,它通常返回一个新对象,有也是返回类型的问题。 通常,这不能是引用,因为没有具有适当类型的对象可以引用自。 像字母信封成语这样的模式已经被开发出来来处理有了这个,但他们不一定简单,而且他们通常有大量的运行时开销。 或者重载运算符返回特殊类型,只保存其参数,并知道如何计算请求时具有正确类型的值。
相关文章:
- 将多态性与运算符 + 重载模板化类结合使用.如何实现基类?
- C++模板方法重载和具有多态性的类访问
- C++ 中多态性和函数重载之间的区别
- 如何用复数和多态性重载运算符
- 正确执行运算符重载和多态性
- 多态性和方法重载在C++中几乎是一样的
- 在C++中创建一个具有多态性和操作重载的模板
- 如果重载函数仅被部分重写,则多态性不起作用
- 动态多态性和运算符重载的真实示例
- C++运算符重载和多态性
- 具有不同签名的多态性和重载函数
- C++:多态性和运算符重载
- c++中的多态性和运算符重载混淆
- c++中的操作符重载和多态性
- 重载父函数是否会规避多态性?
- c++中的动态多态性和函数重载
- Operator=带多态性的重载
- c++多态性和重载
- 重载运算符[]多态性
- C++强制运算符重载和多态性