C++ 多重继承内存寻址问题

2024-01-22

请忽略#include 部分,假设它们已正确完成。另外,这可能是特定于实现的(但 vtable 的概念也是如此),但我只是很好奇,因为它增强了我可视化多重继承。 (顺便说一下,我使用的是MinGW 4.4.0)

初始代码:

class A {
public:
   A() : a(0) {}
   int a;
};

//Edit: adding this definition instead
void f(void* ptrA) {
   std::cout<<((A*)ptrA)->a;
}
//end of editing of original posted code

#if 0
//this was originally posted. Edited and replaced by the above f() definition
void f(A* ptrA) {
   std::cout<<ptrA->a;
}
#endif

编译并生成目标代码。

在我使用的其他一些编译单元中(包含上述代码的头文件后):

class C : public B , public A {
public:
   int c;
}objC;

f(&objC); // ################## Label 1

objC 的内存模型:

//<1> stuff from B
//<2> stuff from B
//<3> stuff from A : int a
//<4> stuff from C : int c

&objC将包含上面假设的内存模型中的起始地址 编译器如何/何时将其转移到 ?是否在检查呼叫时发生Label 1 ?

EDIT::

因为标签 1 似乎是一个赠品,只是让它对编译器来说更加晦涩难懂。请参阅上面编辑的代码。现在编译器什么时候做、在哪里做?


是的,你说得很对。

要完全理解这种情况,您必须了解编译器在两点上知道什么:

  1. 在标签 1 处(正如您已经确定的那样)
  2. 函数内部 f()

    (1) 编译器知道 C 和 A 的确切二进制布局以及如何从 C* 转换为 A* 并将在调用站点执行此操作(标签 1)

    (2) 然而,在函数 f() 内部,编译器仅(需要)了解 A*,因此将自身限制为 A 的成员(在本例中为 int a),并且不能混淆特定实例是否是是否属于其他任何事物的一部分。

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

C++ 多重继承内存寻址问题 的相关文章

随机推荐

  • shell脚本-检查mongodb服务器是否正在运行

    我有一个 shell 脚本来执行一些 mongo db 操作 e g mongo testdb eval db dropDatabase 但是 如果 mongodb 服务器没有运行 我会得到 MongoDB shell version 2
  • 访问 WPF DataGrid“空”或“行列”标头

    我试图访问 Net3 5 WPF DataGrid 中行标题和列标题交叉处的标题 乔什 史密斯 Josh Smith 在有关不同网格控件的文章中将其称为 空标题 我将其称为 RowColumn 标题 因为它位于列标题和行标题的第一个位置 并
  • 使用 Beta API 创建新会议时出现“onlinemeeting 不能为空”错误

    我正在尝试创建一个新会议文档 https developer microsoft com en us graph docs api reference beta api application post onlinemeetings POS
  • location.href 不起作用

    我早些时候使用过 location href 但现在它没有重定向到页面 这是我的代码 function AuthenticateUserWithPage var UId amwayId val username var UPw amwayP
  • Eclipse - Galileo IDE 在构建之前强制保存更改的文件?

    当我使用以前版本的 Eclipse 例如 Ganymede Europa 时 如果我编辑了一个文件然后尝试构建 Eclipse 会提示我先保存 由于我更新到 Galileo 构建 ID 20090920 1017 并刚刚检查更新 当我构建时
  • 如何使用 font-awesome 在 angular5 视图中显示评论星星

    我在数据库中有评论星级值 例子2 5对于一个项目 我想使用 font awesome 在模板中显示它 ul class rating inline ul li i class fa fa star amber text i li li i
  • 为什么GPU做矩阵乘法比CPU更快?

    我已经使用 GPU 一段时间了 没有质疑它 但现在我很好奇 为什么GPU做矩阵乘法比CPU快很多 是因为并行处理吗 但我没有写任何并行处理代码 它自己会自动完成吗 任何直觉 高级解释将不胜感激 如何并行计算 GPU 能够进行大量并行计算 比
  • 未找到 DNN 库。 (谷歌合作实验室)

    我正在开发一个 ML 项目 使用 Google Colab 和 Tensorflow 来训练 CNN 从 EfficientNetV2M 模型开始 它曾经工作得很好 直到两天前开始训练时 train model fit X y epochs
  • 在 MATLAB R2018a 及更高版本中将复数转换为实数,无需数据复制

    Since MATLAB R2018a https www mathworks com help releases R2018a matlab matlab external do i need to upgrade my mex file
  • 通过 Python 使用 BeautifulSoup 库

    我正在学习有关使用 Python 和 Beautiful Soup 库创建地图的教程 我已经下载了 beautiful soup 该文件夹名为 beautifulsoup4 4 1 3 该文件夹的内容在附图中 在教程中 我使用以下代码来导入
  • ASP.NET MVC html 帮助程序可以渲染没有 ID 属性的元素吗?

    假设我想在 ASP NET MVC 2 中生成与此类似的元素 是否有重载或方法可以让 ASP NET MVC 2 仅生成名称属性而不生成 ID 属性 我可以让它生成一个空白 ID 但我想生成根本没有 ID 的元素 并且不重写 asp net
  • 如果不满足两个条件,则拒绝或循环用户输入

    我是一个真正的 Python 初学者 尽管到目前为止我很喜欢它的每一分钟 我正在制作一个小程序 它接受用户输入 然后用它来做一些事情 我的问题是用户输入的数字必须 1 所有加起来不超过 1 即 a1 a2 a3 leq 1 2 每个单独 这
  • 回滚进化

    这个问题可能看起来很愚蠢 但我找不到任何关于如何在 Play 2 0 中回滚进化的说明 谷歌只找到说进化文件的 Downs 部分用于此目的的页面 仅此而已 任何指示或指示将不胜感激 The Downs部分主要用于在脚本更改时恢复 Evolu
  • Common Lisp 格式中可重复的差一问题

    I have format s tabs VT根据是否换行而表现不同 位于行首或行尾 我想知道为什么 不同之处在于 当换行符位于行尾时 行中似乎有一个额外的空格仅一审制表位的 下面举例说明 示例中唯一的区别在于格式控制字符串 它是 A VT
  • Chrome 扩展 PHP 无法运行

    我想在 Chrome 扩展中使用 PHP 我尝试将background html 更改为background php 但这不起作用 我怎样才能做到这一点 你不能这样做 PHP 是一种服务器端语言 这将要求所有用户安装 PHP 解释器 这是不
  • 阻止 SELECT 直到结果可用

    我正在尝试编写一个用于 长轮询 的 PHP 脚本 当新行添加到 Postgres 数据库表时返回数据 有没有办法让 SELECT 查询仅在返回结果时返回 否则阻塞 或者我应该使用数据库之外的另一种信号机制 看看听 通知 NOTIFY 命令发
  • 如何摆脱 Golang 中的无限循环

    我正在用 Go 编写一个程序来猜测随机数 我遇到了 for 循环的问题 我无法阻止 for 循环不断迭代 满足条件后如何跳出循环 for loop true fmt Println read number i n if i ans fmt
  • Xamarin 表单 HttpClient 卡住

    我正在尝试从 soundcloud API 获取响应 这是我的代码 public static async Task
  • 如何使用 Pandas 按月和年对行进行分组和计数?

    我有一个数据集 其中包含姓名 身高 体重和出生日期等个人数据 我会构建一个图表 其中包含特定月份和年份出生的人数 我使用 python pandas 来完成此任务 我的策略是尝试按年和月进行分组并使用计数进行添加 但我得到的最接近的是按年或
  • C++ 多重继承内存寻址问题

    请忽略 include 部分 假设它们已正确完成 另外 这可能是特定于实现的 但 vtable 的概念也是如此 但我只是很好奇 因为它增强了我可视化多重继承 顺便说一下 我使用的是MinGW 4 4 0 初始代码 class A publi