c++ - 在 C++ 中描述什么是虚函数的最简洁但准确的方法是什么?

标签 c++ oop function polymorphism virtual

被要求描述虚函数是什么似乎是评估基本 C++ 知识的面试中最常见的问题之一。然而,经过几年的 C++ 编程,我仍然有一种不舒服的感觉,即我并不真正理解如何最好地定义它们是什么。

如果我查阅维基百科,我看到虚函数的定义是:

"In object-oriented programming, a virtual function or virtual method is a function or method whose behaviour can be overridden within an inheriting class by a function with the same signature"

这个定义看起来简单而优雅,而不是特定于 C++ 的。但对我来说,它似乎没有捕捉到 C++ 中虚函数的概念,因为非虚函数肯定也可以在继承类中被具有相同签名的函数覆盖。

如果我被要求非正式地描述虚函数是什么,我会说一些关于指针的东西,比如“它是一种方法,当你通过基类指针调用它时,它在派生类中定义的版本被调用相反,如果指针实际上指向派生类的实例”。这似乎不是对该概念的非常优雅的描述。我知道人们说这就是 C++ 中实现“多态性”的方式(多态性,据我所知,大致是将对象组织成层次结构的整个想法),但我不知道有什么更好的方式来理解或解释机制而不是通过指针来完成示例。

我想我对虚函数的“指针”描述是否是它们定义的基础,或者只是它们在 C++ 中的实现附带的东西感到困惑。

最佳答案

我一直认为这句话捕获了虚函数的本质:

A virtual function is a way of defining a family of related behaviors that can be customized by the entities that actual have to do those behaviors.

如果您忽略虚函数的所有 C++ 主义 - 虚函数如何使 dynamic_cast 为类类型的对象工作,如何仅在通过指针访问时才对它们进行虚拟处理,虚拟析构函数与虚拟非析构函数等有何完全不同 - 我认为上述陈述是虚拟函数的核心。

我喜欢这句话的主要原因是它以一种将虚函数与编程分离的方式描述了虚函数。您可以通过给出一些具体的类比来使用此定义向非技术人员解释虚函数。例如,“开灯”的想法可以被认为是一个虚函数,因为当你开灯时发生的实际机制完全取决于你使用的特定灯(白炽灯?荧光灯?LED? ), 但概念上的想法在每种情况下都是相同的。当然,这不是一个完美的类比,但我认为它很好地表达了这一点。

更一般地说,恕我直言,如果您曾被要求非正式地描述某事,请尽量远离您正在使用的特定编程语言,如果可能的话,请远离计算机。试着想一想这个概念适用的最普遍的环境,然后在那个层面上描述它。再一次,我教授 CS 入门类(class),所以我对这个领域有一点偏见,所以我不知道这在求职面试环境中有多适用。 :-)

关于c++ - 在 C++ 中描述什么是虚函数的最简洁但准确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370554/

相关文章:

c++ - 'Constexpr' 与 'extern const' 对比。哪个优先?

c++ - 将文件元数据存储在额外文件中

javascript - 试图在 javascript 不良实践中模仿接口(interface)/抽象类

Java 接口(interface)和对象

sql-server - T-SQL 疯狂函数结果

javascript - 将函数绑定(bind)到对象中的另一个函数

C#变量=新函数(){};

c++ - C++ 嵌入式应用程序是否应该为内置 C++ 类型使用带有 typedef 的通用 header ?

c++ - 编译我自己的代码时权限被拒绝

c++ - 在成员构造函数之后调用基类构造函数