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