调用纯虚函数[重复]

2023-12-20

可能的重复:
在构造函数中调用虚函数 https://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors

看看这段代码。 在基类的构造函数中,我们可以使用“this”指针来调用纯虚函数。现在,当我想创建一个指向同一类的类型化指针并将“this”转换为同一类型时。它抛出运行时异常“纯虚函数调用异常”。为什么会这样呢?

#include <iostream>

using namespace std;

class Base
{
  private:
  virtual void foo() = 0;
  public:
  Base()
  {
    //Uncomment below 2 lines and it doesn't work (run time exception)
    //Base * bptr = (Base*)this;
    //bptr->foo();
    //This call works
    this->foo();
  }
};

void
Base::foo()
{
  cout << "Base::foo()=0" << endl;
}

class Der : public Base
{
  public:
  Der()
  {
  }
  public:
  void foo()
  {
    cout << "Der::foo()" << endl;
  }
};

int main()
{
  cout << "Hello World!" << endl;
  Der d;
}

你必须永远不要在构造函数中调用虚函数.

虚拟函数不会按照您想象的方式进行调度。相反,在施工过程中,dynamic正在构造的基子对象的类型是基类型,因此该函数被分派给基函数(在您的情况下是纯虚拟的)。

只是不要这样做。

(原因很明显:在构造派生对象时,必须首先构造基础子对象,因此环境派生对象在基础构造时甚至不存在。)


编辑:这里有一些更多的解释。完全允许并鼓励编译器执行虚拟调度静态地如果他们能做到的话。在这种情况下,在编译时就已经确定将调用哪个实际函数。当你说时会发生这种情况foo() or this->foo() in the Base构造函数,或者当你说x.Base::foo()在其他一些情况下Derived x;是你的对象。当调度静态发生时,那么要么执行Base::foo()直接调用,或者如果没有实现,您会收到链接器错误。

另一方面,如果调度发生动态地,即在运行时,则有可能(尽管不寻常)调度实际上最终选择了Base::foo()作为最终目标。这在“正常”条件下不会发生,因为编译器不会让你用纯虚函数实例化一个类,因此普通动态调度的目标始终是一个必须存在实现的函数(或者至少你如果您不链接它,则会收到链接器错误)。

但还有一种情况,也就是我们所讨论的情况:无论出于何种原因,编译器决定在运行时执行分派,并且 dipatch 以纯虚函数结束。在这种情况下,您的程序将终止。该函数是否实现并不重要,但它只是在多态类层次结构中没有条目(将其视为“vtable 中的空指针”,因此= 0)。为了实现这一点,dynamic对象的类型必须是抽象基类的类型,and调度必须动态发生。前者只能在派生对象的基本构造函数内实现,后者需要您说服编译器不要静态分派调用。这就是两者的区别所在this->foo()(静态)和Base * p = this; p->foo();(动态)出现。(也将其与x.Base::foo(),已发送静态地.)

当然,所有这一切仅仅是实施的结果,并被“未定义的行为”所涵盖。如果你想从中去掉一件事,那就是动态调度找不到纯虚函数。当然,您绝不能在构造函数中调用虚函数。

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

调用纯虚函数[重复] 的相关文章

随机推荐

  • Android Market 搜索引擎如何工作? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何提高应用在 Android Market 搜索结果中的排名 这些应用程序似乎没有按下载量排序 Edit 这个问题的范围仅限于使用 Android
  • 在 iPhone 上拖动 UIScrollView 时,OpenGL ES 视图中的动画冻结

    我有一个动画透明 OpenGL ES 子视图 Apple 模板 EAGLView 类的修改 它绘制一个旋转球体 就像 Apple 的示例一样 CADisplayLink 用于可用的设备 在同一屏幕上 有一个包含可以选择的 UIButtons
  • 如何为默认值“现在”的日期字段建立索引?

    我需要添加日期字段类型 以便文档将当前系统日期时间作为默认值 我正在使用 Elasticsearch 7 5 PUT myindex mappings properties create date type date format yyyy
  • 我不明白为什么我的 JavaScript 文件在链接时不会显示

    我不明白这里出了什么问题 而且我没有从 Javascript 文件中得到任何输出 我正在尝试使用 src 以便能够在索引文件之外键入我的 javascript 文件 这只是打印 html 文件 A test header 中的标题 而不打印
  • 如何使用 Teams JS SDK v2 向 Microsoft Teams 中的用户或频道发送大文本消息?

    我目前正在使用 Microsoft Teams JavaScript SDK v2 TeamsJS 开发一个应用程序 并且正在努力寻找一种向特定用户或频道发送大文本消息的方法 我已成功使用 selectPeople API 使用户能够从列表
  • 什么是 Cache-Control: private?

    当我访问时chesseng herokuapp com http chesseng herokuapp com我得到一个响应标头 如下所示 Cache Control private Connection keep alive Conten
  • 如何在docker中运行无头浏览器?

    我正在使用无头浏览器构建一个爬虫 但现在我想对我的应用程序进行 dockerize 我已经在我的 docker 映像中安装了 chrome 但在运行脚本时它会抛出错误 启动Chrome js const chromeLauncher req
  • @Transactional 与 JPA 和 Hibernate 有什么用?

    我正在学习如何使用 JPA 和 Hibernate 以及 MySQL 数据库创建 REST API 并且我看到了这个 Transactional 注释 有人能解释一下这个注释有什么用吗 例如我有这个简单的 DAO 类 Repository
  • 将 csv 导入到 xlsx python

    我正在尝试将 csv 文件中的一些数据放入现有的 Excel 文件中 我现有的 Excel 文件包含图像 而 xlrd 无法获取图像 我尝试使用 xlsxwriter 但它无法附加到现有的 xslx 我找到的唯一解决方案是使用 openpy
  • AppDelegate 文件适合 MVC 中的什么位置?

    我正在学习 iPhone iPad 编程 我相信我理解了MVC的概念 我遇到的困难是理解普通 iPhone iPad 应用程序中的某些文件如何适合 MVC 当您使用 基于视图的应用程序 模板创建新应用程序时 将创建 AppDelegate
  • Python pandas - 如果该项目在列表中,则新列的值

    我想在 pandas 数据框中创建一个新列 第一列包含国家 地区名称 该列表包含我感兴趣的国家 例如欧盟 新列应指示数据框中的国家 地区是否在列表中 以下是代码的简化版本 import pandas as pd import numpy a
  • 如何求一系列数字的最小公倍数?

    给定一个由两个数字组成的数组 让它们定义一系列数字的开始和结束 例如 2 6 表示范围 2 3 4 5 6 我想编写 javascript 代码来查找范围的最小公倍数 我下面的代码仅适用于小范围 而不是类似的 1 13 即范围 1 2 3
  • SSH 握手抱怨缺少主机密钥

    我正在尝试连接到远程主机并检查文件是否存在 在这个阶段 我只是尝试连接 但出现错误 2017 08 01 18 16 39 unable to connect ssh handshake failed ssh required host k
  • 如何并行化 Azure ML 服务计算集群上的工作?

    我可以使用计算集群将作业提交到 Azure ML 服务 它运行良好 并且自动缩放与自定义环境的良好灵活性相结合似乎正是我所需要的 然而 到目前为止 所有这些作业似乎只使用集群的一个计算节点 理想情况下 我希望使用多个节点进行计算 但我看到的
  • 当我在 android 中使用哈希映射时显示警告(使用新的 SparseArray

    我是 Android 开发新手 在我使用的 Android 应用程序中HashMap 但我收到警告 Use new SparseArray
  • URL 中的段落字符?

    我刚刚遇到了这个Google 应用引擎文章 http code google com googleapps appsscript articles appengine html在某些 URL 中使用有趣的反向 P 字符 查看第一个代码框顶部
  • 使用 FastObjImporter 在场景中加载并显示 obj 模型

    在我的 Unity 项目中 我想使用在互联网上找到的 FastObjImporter 类将 obj 放入场景中 我是否必须创建一个空的 GameObject 并将已处理的 obj 分配给它 尝试使用空的游戏对象 GameObject go
  • 如何使用 Flutter 在 Android 和 iOS 上实现振动?

    我正在尝试使用 Flutter 在单击按钮时实现振动 我发现说实话非常困难 我尝试使用以下软件包但未成功 振动 https pub dev packages vibration and vibrate https pub dev packa
  • 无法使用 Jekyll 生成任何内容

    当我运行 Jekyll 时 它不会生成任何内容 我看到的输出 Configuration from home mbsheikh techtraits techtraits blog config yml Auto regenerating
  • 调用纯虚函数[重复]

    这个问题在这里已经有答案了 可能的重复 在构造函数中调用虚函数 https stackoverflow com questions 962132 calling virtual functions inside constructors 看