【问题标题】:Object Oriented approach of Polymorphism多态的面向对象方法
【发布时间】:2017-05-02 13:26:54
【问题描述】:

在我的 C++ OOP 课程中,我学到了关于如何为派生类提供虚函数接口的多态性。但问题是这一切有什么帮助?每次我们创建一个基类指针并在其中存储一个派生类对象,但是为什么呢?我们不能仅仅通过函数覆盖来做到这一点。 请告诉一个除了 C++ 中的多态之外无法解决的编程问题

【问题讨论】:

    标签: c++ polymorphism


    【解决方案1】:

    虚拟函数和覆盖与非虚拟函数和名称隐藏

    虚函数使类具有多态性。可以在派生类中重写虚函数。当您通过基类指针调用该函数时,它始终是与将调用的指向对象的真实动态类型相对应的函数。它是在运行时动态确定的。

    不能覆盖非虚拟函数。当派生类具有与基类具有相同签名的非虚拟函数时,它是两个不同的函数,但派生类的名称隐藏了基类的名称。当您通过基类指针调用函数时,始终是与将被调用的基类对应的函数。这是编译时的静态确定。

    有什么好处?我们需要虚函数吗?

    虚拟函数只是定义抽象的一种简单方法。典型的例子是形状。您定义了一个抽象形状,带有一个虚拟函数,例如calculateSurface()。然后,您可以通过任何指针调用该函数,并且您将确保对于任何具体形状(例如圆形、方形、六边形...),它始终会为对象应用正确的公式。

    抽象很方便。但你可以没有它。例如,您也可以通过使用形状代码来实现相同的功能,并拥有一个calculateSurface(),它将根据形状代码执行正确的公式。这是完全可能的。只是更难维护,因为每次创建新形状时,都需要在行为依赖于形状的所有位置添加另一个 if (shapeCode==xx) 子句。

    事实上,您甚至不需要 OOP。在以前,在 c++ 存在之前,使用 C 中的函数指针来模拟这种类型相关行为(使用包含每个类型相关操作的函数指针的结构)是一种常见的编程技术。同样,这是完全可行的,但更乏味、更容易出错且封装更少。

    因此,不存在需要解决多态性的问题。在很多问题中,OOP 和多态性使问题更容易解决,代码更易于维护。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 2014-08-24
      • 2014-10-21
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多