我在C ++ OOP类中学过关于多态性的知识,我们如何为派生类提供虚函数接口。但问题是这一切有什么用呢?每次我们创建一个基类指针并在其中存储派生类对象,但为什么呢?我们不能仅仅通过功能覆盖来做到这一点。 请告诉一个编程问题,除了C ++中的多态性之外无法解决这个问题
答案 0 :(得分:0)
虚函数使类具有多态性。可以在派生类中覆盖虚函数。当您通过基类指针调用该函数时,它始终是与将被调用的poined对象的实际动态类型相对应的函数。它是运行时的动态决定。
无法覆盖非虚拟功能。当派生类具有与基类具有相同签名的非虚函数时,它是两个不同的函数,但派生类的名称隐藏了基类之一。当你通过基类指针调用函数时,它总是与将要调用的基类相对应的函数。它是编译时的静态确定。
虚函数只是定义抽象的一种简单方法。典型的例子是形状。您可以使用calculateSurface()
等虚拟函数定义抽象形状。然后,您可以通过任何指针调用该函数,并且您将确保对于任何具体形状(例如圆形,方形,六边形......),它将始终为对象应用正确的公式。
抽象很方便。但你可以没有它。例如,您也可以通过使用形状代码实现相同的功能,并具有一个calculateSurface()
,它将根据形状代码执行正确的公式。这完全有可能。维护起来比较困难,因为每次创建新形状时,您都需要在行为依赖于形状的所有位置添加另一个if (shapeCode==xx)
子句。
实际上你甚至不需要OOP。以前,在c ++存在之前,使用C中的函数指针模拟这种类型依赖行为(使用包含每个类型相关操作的函数指针的结构)是一种常见的编程技术。同样,它完全可行,但更加繁琐,更容易出错且封装更少。
因此,没有问题需要解决多态性。有很多问题,OOP和多态性使问题更容易解决,代码更易于维护。