在评估基本 C++ 知识的面试中,被要求描述什么是虚函数似乎是最常见的问题之一。然而,在 C++ 编程几年之后,我仍然有一种不舒服的感觉,即我并不真正理解如何最好地定义它们是什么。
如果我查阅维基百科,我看到虚函数的定义是:
“在面向对象编程中,虚函数或虚方法是一种函数或方法,其行为可以在继承类中被具有相同签名的函数覆盖”
这个定义看起来简单而优雅,而不是特定于 C++ 的。但对我来说,它似乎没有捕获 C++ 中虚拟函数的概念,因为非虚拟函数肯定也可以在继承类中被具有相同签名的函数覆盖。
如果有人要求我非正式地描述虚函数是什么,我会说一些关于指针的内容,例如“它是一种方法,当您通过基类指针调用它时,会调用派生类中定义的版本,如果该指针实际上指向派生类的实例”。这似乎不是对这个概念的一个非常优雅的描述。我知道人们说这就是 C++ 中实现“多态性”的方式(据我所知,多态性大致是将对象组织成层次结构的整个想法),但我不知道有更奇特的方式来理解或解释该机制比通过指针浏览示例更重要。
我想我很困惑虚拟函数的“指针”描述是否是它们定义的基础,或者只是它们在 C++ 中实现的附带内容。
我一直认为这句话抓住了虚函数的本质:
虚函数是一种定义一系列相关行为的方法,这些行为可以由实际必须执行这些行为的实体进行定制。
如果您忽略虚拟函数的所有 C++ 主义 - 拥有虚拟函数如何实现dynamic_cast
适用于类类型的对象,如何仅在通过指针访问时虚拟地处理它们,虚拟析构函数与虚拟非析构函数完全不同,等等。 - 我认为上述陈述是虚拟的核心功能就是一切。
我喜欢这个说法的主要原因是它以一种将虚拟函数与编程解耦的方式描述虚拟函数。您可以通过给出一些具体的类比,使用此定义向非技术人员解释虚拟函数。例如,“打开灯”的想法可以被认为是一个虚拟函数,因为打开灯时发生的实际机制完全取决于您使用的特定灯(白炽灯?荧光灯?LED? ),但每种情况下的概念思想都是相同的。当然,这不是一个完美的类比,但我认为它已经很好地表达了要点。
更一般地说,恕我直言,如果您被要求非正式地描述某些内容,请尝试尽可能远离您正在使用的特定编程语言,并且如果可能的话,远离计算机。尝试考虑该概念适用的最一般环境,然后在该级别进行描述。话又说回来,我教授计算机入门课程,所以我对这个领域有一点偏见,所以我不知道这在工作面试环境中有多适用。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)