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

2024-02-19

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

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

“在面向对象编程中,虚函数或虚方法是一种函数或方法,其行为可以在继承类中被具有相同签名的函数覆盖”

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

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

我想我很困惑虚拟函数的“指针”描述是否是它们定义的基础,或者只是它们在 C++ 中实现的附带内容。


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

虚函数是一种定义一系列相关行为的方法,这些行为可以由实际必须执行这些行为的实体进行定制。

如果您忽略虚拟函数的所有 C++ 主义 - 拥有虚拟函数如何实现dynamic_cast适用于类类型的对象,如何仅在通过指针访问时虚拟地处理它们,虚拟析构函数与虚拟非析构函数完全不同,等等。 - 我认为上述陈述是虚拟的核心功能就是一切。

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

更一般地说,恕我直言,如果您被要求非正式地描述某些内容,请尝试尽可能远离您正在使用的特定编程语言,并且如果可能的话,远离计算机。尝试考虑该概念适用的最一般环境,然后在该级别进行描述。话又说回来,我教授计算机入门课程,所以我对这个领域有一点偏见,所以我不知道这在工作面试环境中有多适用。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中描述虚函数的最简洁而准确的方法是什么? 的相关文章

  • ASP MVC4 - 通过视图模型传递列表以查看

    我有一个模型人物 其中包括出生日期等字段 我想将所有人的列表以及每个人的计算年龄传递给视图 因此 视图模型 public class vm PersonList public Person Person get set public int
  • 在没有事件的情况下从 HTML 执行 javascript 函数

    我希望从 HTML 页面调用 javascript 函数 并且我do not希望它依赖于任何事件 该函数位于单独的 js 文件中 因为我希望在许多网页中使用它 我也将变量传递给它 我试过这个 HTML fp footer2 js中的函数 f
  • C++ 最大非负整数

    以下内容是否会在所有平台 int 大小等上按预期工作 或者有更容易接受的方法吗 我做了以下的事情 define MAX NON NEGATIVE INT int unsigned int 1 2 我不会通过解释它在做什么来侮辱你的智商 编辑
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • EntityFramework:“参数值超出范围。”

    我在 EntityFramework 模型优先 中保存小数时遇到问题 在我的 EDMX 中 我声明我的属性为 Decimal 30 10 然后我尝试保存该数字 1215867935736100000 结果是 Parameter value
  • 如何测试 PARTIAL 视图在 C# ASP .NET MVC 中呈现

    我有一个视图 它内部有部分视图渲染 div class partialViewDiv Html RenderPartial partial Model SomeModelProperty div 和一个返回此视图的控制器 public Ac
  • Python NET 调用具有返回值和输出参数的 C# 方法

    我有以下静态 C 方法 public static bool TryParse string s out double result 我想使用 Python NET 包从 Python 调用它 import clr from System
  • 从网站保存嵌入的 pdf

    我正在编写一个小型 C 应用程序来管理供应商提供的 化学品 安全数据表 目前 我手动搜索该化学品并保存 pdf 并在我的程序中添加指向 pdf 的链接 问题是我还有很多化学品需要处理 所以最好将过程自动化 例如 化学品的部件号如下 2710
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • gcc总是做这种优化吗? (公共子表达式消除)

    作为示例 假设表达式sys gt pot atoms item gt P kind mass在循环内求值 循环只改变item 因此表达式可以简化为atoms item gt P kind mass通过将变量定义为atoms sys gt p
  • 如何使用实体框架更新特定记录的一个字段?

    我想要更新一个名叫 Pejman 的人的家庭情况 这是我的对象类 public class Person public int Id get set public string FirstName get set public string
  • 在 C、C++ 中实现腐蚀、膨胀

    我对二值图像的膨胀是如何完成的有理论上的了解 AFAIK 如果我的 SE 结构元素 是这样的 0 1 1 1 在哪里 代表中心 我的图像 二进制是这样的 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
  • 自定义编译器警告

    在 Net 中使用 ObsoleteAtribute 时 它 会向您发出编译器警告 告诉您该对象 方法 属性已过时 应使用其他内容 我目前正在从事一个需要大量重构前员工代码的项目 我想编写一个自定义属性 可用于标记方法或属性 这些方法或属性
  • 带有 epgm 的 ZeroMQ PUB/SUB 无法接收同一主机上进程发送的消息

    我的所有进程都有两个套接字 一个 PUB 和一个 SUB 并且它们都使用相同的多播地址和端口 例如 PUB 会这样做 绑定 epgm 239 192 1 1 5555 SUB 将执行以下操作 连接 epgm 239 192 1 1 5555
  • 使用 STL 迭代器而不初始化它

    我想做这样的事情 container iterator it NULL switch eSomeEnum case Container1 it vecContainer1 begin break case Container2 it vec
  • 捕获 System.Exception 总是不好的做法吗?

    请考虑下面的代码 它抛出三个不同的异常 即 System Configuration ConfigurationErrorsException System FormatException and System OverflowExcept

随机推荐

  • 在 Eclipse CDT 中创建一个新的 C++ 项目,设置与另一个项目相同

    是否有一种简单的方法来创建克隆现有项目设置的新 C 项目 在开发 C 时 我喜欢编写许多小测试和示例 但如果我的代码依赖于外部库 就像它们经常做的那样 我必须每次都从头开始设置包含 库 编译器设置等 有某种模板机制吗 我了解 C C 项目设
  • node.js oracledb 不插入也不更新

    节点 oracledb 版本 1 2 节点 v0 12 7 按预期选择工作 对于更新和插入 虽然我们得到 rowsAffected 1 但插入或更新不受影响 var oracledb require oracledb oracledb ge
  • 使用本地存储存储多个项目的复选框“已选中”

    我想将我的复选框保存到本地存储 但是我使用的这段代码对于多个复选框来说太麻烦了 有没有更好的方法来做到这一点 setStatus document getElementById LineOp setStatus onclick functi
  • 调用其他程序时Powershell变量扩展

    我在尝试使用解压缩文件时遇到一个小问题7za http 7 zip org download htmlPowershell 中的命令行实用程序 我设置了 zip source变量为 zip 文件的路径和 unzip destination到
  • 在 Vue.js 中使用异步/等待模式

    我想在我的新 Vue js 项目中使用 async await 模式 然而 在我第一次尝试后 它抛出了一个错误
  • TreeMap 是如何排序的

    如何TreeMap种类 举例来说 您有以下地图 TreeMap
  • 当互联网断开连接时,HttpClient PostAsync 不响应

    我有一个 xamarin 表单应用程序 该应用程序执行PostAsync调用将图像作为多部分内容上传 问题是在 iOS 设备中 当我在 PostAsync 调用期间关闭 wifi 移动数据时 HttpClient 不会进入 catch 块来
  • 如何从C#读取中文文本文件?

    如何使用 C 读取中文文本文件 我当前的代码无法显示正确的字符 try using StreamReader sr new StreamReader path System Text Encoding UTF8 This is an arb
  • 如何将JScrollPane布局设置为与JTable相同?

    Tabel1 setModel new DefaultTableModel x y JScrollPane pane new JScrollPane Tabel1 当我运行该程序时 滚动窗格看起来比表格大 如何使滚动窗格布局与表格相同 ho
  • Angular 4 - 获取输入值

    我想知道如何从角度 4 上的输入获取值 我查看了有关 Angular 的文档 并且带有关键事件的示例对我来说效果不太好 我找不到正确的示例如何做到这一点 所以请帮助我 问题 我尝试读取输入的值 然后将值提交到另一个组件 该组件会将值添加到选
  • 如何在opencv中使某些像素透明?

    我用 for 语句检查了每个像素的亮度 并尝试在亮度超过 100 时使其透明 但隐形是行不通的 看代码 image al x y 的第四个是alpha 我应该怎么办 如果你使用 bgr 的值而不是透明度 它就会改变 image cv2 im
  • symfony2 - Doctrine - 如何使用计数和分组进行多重选择

    在 Symfony2 和 Doctrine 中 我想执行一个返回计数和分组依据的查询 这是我尝试过的 这是我要运行的 SQL SELECT terrain id COUNT FROM Partie WHERE 1 1 GROUP BY te
  • 扩展/插件通信的架构

    一旦解决了加载插件的问题 在 NET 中 在例外情况下通过 MEF 下一步要解决的是与它们的通信 简单的方法是实现一个接口并使用插件实现 但有时插件只需要扩展应用程序的工作方式 并且可能有很多扩展点 我的问题是关于如何处理这些扩展点 我已经
  • 多态调用的成本 - C++

    我正在用 C 编写一个游戏 其中有大约 30 个不同的角色 每个角色都略有不同 我有一个主类 User 其中包含所有角色所需的所有数据 我的第一个实现涉及仅枚举 30 个角色并进行适当的处 理 但现在我想知道将 User 作为基类并且每个角
  • 谷歌搜索引擎优化和隐藏元素

    谷歌会忽略CSS中设置为 display none 的元素内的单词吗 Example div style display none About Us Contact Us div 我想隐藏这样的菜单看起来可能有点奇怪 但是有一个子菜单 并将
  • PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

    我正在尝试定义一个Markdown https hackage haskell org package markdown 0 1 9 docs Text Markdown html新类型 并使用GeneralizedNewtypeDeriv
  • 如何在 Laravel 5 中建立用户和角色关系

    我有两张桌子 User gt id name role id gt references id gt on roles Roles gt id role name access 我正在尝试从用户访问角色详细信息 我的用户模型有 public
  • 如何使用 Bower 进行最小安装

    我使用 Bower 来管理项目中使用的所有前端库和工具 我的bower json文件看起来像这样 name New Project version 0 1 0 dependencies jquery 1 11 1 bootstrap 3 3
  • SqlException:用户“NT AUTHORITY\NETWORK SERVICE”登录失败

    当我通过 VS 2008 运行 Web 应用程序时 该应用程序能够登录到 Sql 服务器并检查用户输入的凭据 用户名和密码 但是当我通过 IIS 7 浏览到该应用程序并尝试回发用户名和密码时 应用程序报告异常 System Data Sql
  • 在 C++ 中描述虚函数的最简洁而准确的方法是什么?

    在评估基本 C 知识的面试中 被要求描述什么是虚函数似乎是最常见的问题之一 然而 在 C 编程几年之后 我仍然有一种不舒服的感觉 即我并不真正理解如何最好地定义它们是什么 如果我查阅维基百科 我看到虚函数的定义是 在面向对象编程中 虚函数或