动态多态性和运算符重载的真实示例
Real life example of Dynamic Polymorphism & Operator Overloading
这是我在一次采访中问到的,因为我提到OOPS是我最喜欢的科目。
谁能给出一些动态多态性和运算符重载的真实例子?
我只能用编码来解释,比如计算不同形状的区域(虚函数+覆盖)和添加复数或字符串连接(运算符重载)。
多态性。
我们有车,对吧。想想一辆抽象的汽车。每辆车都可以加速。这将是一个多态函数。因此,在每辆(好吧,大多数,我们不计算异国情调的东西)汽车中,您需要踩下踏板才能加速。但是,对于不同的汽车,按下后会发生什么是不同的(阅读:已定义的实现)。
运算符重载。
你有复数。您可以像使用普通数字一样对它们进行加、减、除(等)。但是,您的工作方式完全不同。
upd:没看到你在问题中提到了复数((我会想到一个更好的。
UPD2:嗯,你可以想到烹饪的过程。当你做饭时,你需要混合一些成分。您可以添加它们(例如将它们放在同一个盘子中),将它们分开(切),乘以它们(例如混合饮料)等等。我想这会让这些运算符超载:P
std::cout
是运算符重载的典型子项之一。虽然实际运营商的选择是...值得怀疑的是......,与之前的一切相比,<<
的可扩展性是巨大的,几乎所有之后的东西也是如此。此外,考虑所有Matrix
和Vector
类、迭代器、函数对象,以及所有<
重载的类,以便它们可以成为map
的键或像std::string
一样排序。
多态性非常简单。想想如果你没有模板形式的参数多态性,生活会是什么样子。天哪,太糟糕了。我是否为新类型重复此容器的代码,这是一个非常糟糕的主意,或者我是否使用无法处理复杂类型且完全不安全的void*, size
垃圾?像qsort
这样的东西的界面也无法使用。参数化多态性允许代码重用和类型安全。
或动态多态性。 没有虚拟函数和继承std::function
无法工作,这是一件非常重要的事情。还有基于继承的嵌入式优化。每当需要在运行时交替处理不同类型的类型时,它都很有用。此外,还有许多东西实际上是动态多态性的,即使它们在技术上不是。例如,从 Windows API 调用的每个函数都经过动态链接器修复的函数指针表。它们与符合同一接口的这些函数的任何实现都是多态的。如果没有操作系统 API,生活会是什么样子?不宜居住。
我对动态多态性有一个想法:
假设我们有一个类Car
,它有几个子类型Maruti-800
、Indica
、Zen
、Inova
。
假设在赛车游戏中,我们必须阻止一辆到达最终目的地的汽车。 目前我们不知道我们拥有哪种类型的汽车(无论是Maruti-800
还是Indica
或任何其他类型的汽车)。 所以我必须在超类引用上按中断(即 Car
),通过在运行时调用Car
上的操作Break
。
这是动态多态性的很好的例子。
动态多态性:自动车上的运动模式。当我们将其切换到运动模式时,我们仍然使用相同的油门踏板施加相同的压力,但自动档位对我们来说以更高的转速更换。
运算符重载:移动电话。根据您打开的菜单,按钮会执行不同的操作。游戏中的D是转发的,在短信中它打印字符d。
运算符重载的一个例子是在 iostream 运算符中<<或者另一个例子是当"制作"函子时
动态多态性基本上是覆盖父级的虚拟方法,它允许您"编程到接口"(纯虚函数)。 这与静态多态性相反,静态多态性迫使您使用具体类型才能使用"重写"方法。 这是差异的一个很好的例子。
- 激励'inline'说明符的真实世界示例?
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 动态多态性和运算符重载的真实示例