这是在一次采访中被问到的,因为我提到 OOPS 是我最喜欢的主题。
谁能给出一些动态多态性和运算符重载的真实例子?
我只能从编码的角度来解释,比如计算不同形状的区域(虚函数+覆盖)和添加复数或字符串连接(运算符重载)。
多态性。
我们有车,对。想想一辆抽象的汽车。每辆车都可以加速。那将是一个多态函数。因此,在每辆(嗯,大多数,我们不计算异国情调的东西)汽车中,您都需要踩下踏板来加速。但是,不同的汽车按下它后会发生什么(阅读:定义的实现)。
运算符重载。
你有复数。您可以像使用普通数字一样对它们进行加、减、除(等)操作。但是,您执行此操作的方式完全不同。
upd:没有看到您在问题中提到了复数((我会想到一个更好的。
upd2:你可以想到烹饪的过程。当你做饭时,你需要混合一些配料。您可以添加它们(例如将它们放在同一个盘子中),将它们分开(切割),将它们相乘(例如混合饮料)等等。我想这会导致这些运算符重载:P
std::cout
是运算符重载的典型代表之一。虽然实际操作员的选择是……值得商榷……,<<
与之前的所有东西相比,它的可扩展性是巨大的,几乎所有之后的东西也是如此。此外,考虑所有的Matrix
andVector
类、迭代器、函数对象,所有那些<
重载的类,因此它们可以是 a 的键map
或排序为std::string
.
多态性非常简单。想想如果你没有模板形式的参数多态性,生活会是什么样子。天哪,那会很糟糕。我是否要为一个新类型重复这个容器的代码,这是一个非常糟糕的主意,或者我是否应该使用那些void*, size
无法处理复杂类型并且完全不安全的垃圾?类似的东西的界面qsort
也无法使用。参数多态性允许代码重用和类型安全。
或动态多态性。std::function
没有虚函数和继承就无法工作,这是一件非常重要的事情。还有基于继承的嵌入式端优化。当您需要在运行时可互换地处理不同类型时,它很有用。此外,有许多东西实际上是动态多态性,即使它们在技术上不是。例如,您从 Windows API 调用的每个函数都通过动态链接器固定的函数指针表。它们是多态的,具有符合相同接口的那些函数的任何实现。如果没有操作系统 API,生活会怎样?不宜居住。
我对动态多态性有一个想法:
假设我们有一个类Car
有几个子类型Maruti-800
, Indica
, Zen
, Inova
。
假设在赛车游戏中,我们必须停下一辆到达其最终目的地的汽车。此时我们不知道我们拥有哪种类型的汽车(无论是Maruti-800
还是Indica
其他类型的汽车)。所以我必须通过在运行时Car
调用动作来按下超类引用(即)的中断。Break
Car
这是动态多态性的一个很好的例子。
动态多态性:自动车上的运动模式。当我们将其切换到运动模式时,我们仍然使用相同的油门踏板施加相同的压力,但自动齿轮会以更高的转速进行更换。
运营商重载:手机。根据您打开的菜单,按钮执行不同的操作。游戏中的 D 是前锋,在短信中它会打印字符 d。
运算符重载的一个示例是在iostream operator<<中,或者另一个示例是在“制作”仿函数时
动态多态性基本上是覆盖父级的虚方法,它允许您“编程到接口”(纯虚函数)。这与静态多态性相反,静态多态性迫使您使用具体类型来使用“覆盖”方法。这是一个很好的例子。