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