指向基类的基本多态指针

2024-04-27

虽然我已经在 C++ 领域工作了一段时间,但直到现在我才需要使用多态特性,而且我对它们非常感兴趣。

如果我有一个基类ClassA和另一个ClassB从中衍生出来,我明白我可以拥有virtual中的成员函数ClassA即,当实施于ClassB,将被称为ClassB实例,即使该实例是使用 a 指向的ClassA指针。没有这个virtual关键字,我认为使用基类指针时基类实现将占上风,但对从子类实例化的对象进行操作,这对我来说似乎是有问题的,如果事实上ClassB有自己的相同功能的实现,在这种情况下实际上会被忽略。

这是对多态行为的正确理解吗?

现在真正的问题是你如何引用ClassB使用指向基类的指针。我真的只能想到两个办法:

  1. 在实例化时创建指针,使用返回基类指针的函数,同时使用子类的构造函数实际为子类分配内存。 (这样的创建函数有通用的名字吗?)
  2. 使用以下方式投射对象static_cast并将其分配给指向基类的指针。

这是生成指向子类对象的基类指针的两种主要技术吗?


最简单的方法是简单地分配它,不需要强制转换:

ClassA *ptrA = new ClassB;

你是对的,你需要virtual关键字以启用多态行为。这是一种思考方式。 C++ 对对象的静态类型进行操作。你打电话时ptrA->foo(),指针的类型是ClassA*。如果该函数没有声明virtual,然后它会盲目调用ClassA的函数版本。没有其他选择。但如果foo() is virtual,然后它知道停下来问,“等等,我到底是什么类型的?”这种情况下的答案是ClassB,所以它会调用ClassB的版本。

另请注意,您不需要指针来实现此目的。您将看到多态性的另一种常见方式是通过函数调用:

void bar(ClassA &aObj)
{
    aObj.foo();
}

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

指向基类的基本多态指针 的相关文章

  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • 正则表达式,获取两个关键字之间的整个字符串

    我正在做一些输出解析 我需要从两个单词之间抓取一大块文本 例如 如果我正在解析文本 Hi this is an example 我希望能够指定我的两个单词是 Hi 和 example 然后我将取回字符串 this is an 我知道正则表达
  • SQL 中的模糊分组

    我需要修改 SQL 表以对稍微不匹配的名称进行分组 并为组中的所有元素分配标准化名称 例如 如果初始表如下所示 Name Jon Q John Q Jonn Q Mary W Marie W Matt H 我想创建一个新表或向现有表添加一个
  • 比较 Java 中的两个基元数组?

    我知道 Arrays deepEquals Object Object 但这不适用于原始类型 由于数组和自动装箱的限制 请参阅这个相关帖子 https stackoverflow com questions 517751 java gene
  • 在智能手机上选择尺寸为正常尺寸

    在我的网络应用程序中 我创建了一个选择size 5 正确显示 您可以从图像中看到 当我在移动设备上打开应用程序时 我得到的是这个维度 您如何看到尺寸不正确 我通过代码而不是CSS设置尺寸 我再说一遍 这在桌面上有效 但在移动设备上不起作用
  • Swift 3 - 扩展字典数组

    我有这一系列字典 var dicts key1 value1 key2 value2 key1 value3 key2 value4 我应该如何延长Array这样我就有这个功能 dicts values of key1 result val
  • 当隐藏箭头对象时,如何以编程方式识别在图表上绘制向上/向下箭头?

    我知道如何在图表上绘制对象箭头 我通常这样做 ObjectCreate 0 prevHigh OBJ ARROW DOWN 0 Time 0 High highestCandle ObjectSetInteger 0 prevHigh OB
  • 在 Xcode 7 中下载适用于 10.9 和 10.10 的 Mac OS X SDK

    是否可以使用 Xcode 7 在 OS X 10 11 上下载并针对 Mac OS X 10 9 和 10 10 SDK 进行构建 是的 这是可能的 Xcode遗产 https github com devernay xcodelegacy
  • Emacs:如何拉动最后拉动的文本,无论后续杀戮如何?

    我经常发现自己在完成一些杀戮后反复猛拉一些东西 它变成了一个像这样的过程 C y C y M y C y M y M y C y M y M y M y 每次我删除一些文本时 它都会将第一个删除推回到删除环中 以便我需要循环遍历所有删除以返
  • 在android中启动基于文件的Activity

    我正在开发一个应用程序 它列出文件夹中的文件 在 ListView 中 当用户单击其中一个项目时 如果它是一个文件 那么我想启动一个可以处理它的活动 如果有的话 或者如果没有则显示某种错误消息 我怎样才能做到这一点 当然 这不是全部 但我如
  • find 命令的“exec”功能可以在后台启动程序吗?

    我想做这样的事情 find iname Advanced Linux Program exec kpdf 可能的 还有其他类似的方法吗 首先 它不会像你输入的那样工作 因为 shell 会将其解释为 find iname Advanced
  • 这个具有多个值(变量)的 return 语句如何工作? [复制]

    这个问题在这里已经有答案了 我试图了解 C 函数中按值传递和返回是如何发生的 我发现一段代码如下 include
  • 如何在样式定义中排除包含所有子级的类

    我有一个像这样的文件 div div class abc div div div div 我想要做的是将样式仅应用于第一个 div 我尝试使用div not abc abc div not abc not abc div not abc d
  • Sitecore Workbox,显示名称的项目字段?

    默认情况下 Sitecore 工作箱显示项目名称 我想显示 标题 字段 自定义字段 我怎样才能做到这一点 我有一个类似的要求 客户需要 Workbox 显示项目的 路径 而不是其名称 问题是他们的许多物品具有相同的名称 因此很难区分物品 不
  • 在Java程序中打开Windows虚拟键盘

    我想在按钮中创建一个事件 当我单击按钮时 我想打开 Windows 虚拟键盘 你能帮我看一下代码吗 谢谢您的合作 此致 您可以使用 getRuntime 来执行它 import java io IOException public clas
  • 用于解析文件( csv )并逐行处理的 Shell 脚本[重复]

    这个问题在这里已经有答案了 您好 需要一个 shell 脚本来解析 csv 文件 逐行解析 然后逐个字段 该文件将如下所示 X1 X2 X3 X4 Y1 Y2 Y3 Y4 我需要提取这些 X1 X2 我写了一个脚本 但如果行超过一行 它就会
  • 安全规则仅允许具有经过验证的电子邮件的用户进行写入

    我有非常简单的写入安全规则 应该只允许具有经过验证的电子邮件的用户写入数据 someNode write auth token emailVerified true 由于某种原因 我仍然在具有特定用户令牌的模拟器中和在具有同一用户的应用程序
  • 在 Express + NodeJS 应用程序的控制器中使用 ES6 类或对象文字

    有两件事我很困惑 使用任何 ES6 类或对象文字的优点是什么 我应该在哪里使用它们 下面提到了我正在尝试的一些示例 请让我知道何时使用特定的实现方式 何时不使用 类例1 auth js class Auth login req res si
  • 使用嵌套对象进行 Hapi/Joi 验证

    我对我的其中一条路线进行了以下验证 payload keywordGroups Joi array items Joi object keys language Joi string required containsAny Joi arr
  • 从一个 Nodejs 应用程序调用另一个 Nodejs 应用程序中的 API 的方法

    我们的应用程序将有一个网站和一个移动应用程序 两者都与同一个 API 后端进行通信 我有一个仅提供 API 服务的 Nodejs 应用程序 还有一个为网站提供 html 页面服务的 Nodejs 应用程序 我正在为这两个应用程序使用 Exp
  • 指向基类的基本多态指针

    虽然我已经在 C 领域工作了一段时间 但直到现在我才需要使用多态特性 而且我对它们非常感兴趣 如果我有一个基类ClassA和另一个ClassB从中衍生出来 我明白我可以拥有virtual中的成员函数ClassA即 当实施于ClassB 将被