C++ 虚拟继承内存布局

2024-01-16

虚拟继承内存布局

我试图完全理解虚拟继承和 vTables/vPtrs 的内存幕后发生的事情以及不发生的事情。

我有两个我编写的代码示例,我确切地理解它们工作的原因,但我只是想确保我心中对对象内存布局有正确的想法。

Here http://postimg.org/image/eyhxhc7g1/full/是图片中的两个示例,我只是想知道我对所涉及的内存布局的想法是否正确。

示例1:

class Top { public: int a;  };
class Left : public virtual Top {  public: int b; };
class Right : public virtual Top { public: int c; };
class Bottom : public Left, public Right { public:  int d; };

示例2:

与上面相同,但具有:

class Right : public virtual Top {
public:
    int c;
    int a;  // <======= added this
};

C++ 标准没有对对象布局做太多说明。虚拟函数表(vtable)和虚拟基指针甚至不是标准的一部分。所以问题和答案只能说明可能的实现。

快速查看您的绘图似乎显示了正确的布局。

您可能对这些进一步的参考资料感兴趣:

  • 多重继承被认为是有用的 http://www.drdobbs.com/cpp/multiple-inheritance-considered-useful/184402074一篇关于多重继承和虚拟继承情况下的布局的 ddj 文章。

  • 微软专利 http://www.google.com.pa/patents/US5754862描述 vfptr(虚拟函数表,又名 vtable)和 vbptr(虚拟基指针)的使用。

编辑:Bottom 是否继承Right::a or Left::a ?

In your test 2, Right and Left拥有同一个共同的父母Top。所以只有一个子对象Top within Bottom,因此,只有一个且相同的Top::a.

有趣的是,您在测试 2 中引入了一名成员a in Right。这是一a这与a继承自Top。它是一个独特的成员,只是“巧合”地与另一个成员同名。所以如果你访问a通过Right, Right::a隐藏Top::a(顺便说一下,这也是Bottom::Top::a, the Right::Top::a, the Left::Top::a)。在本例中,bottom.a 表示 Right::a,不是因为对象布局,而是因为名称查找(和隐藏)规则。这与实现无关:它是标准的且可移植的。

这里有一个测试 2 的变体来演示这种情况:

int main() {
    Bottom bottom; 
    bottom.a = 7; 
    cout << bottom.Top::a << endl << bottom.Left::Top::a << endl;
    cout << bottom.Right::Top::a << endl << bottom.Left::a << endl;
    cout << bottom.Right::a << endl <<endl;
    bottom.Right::a = 4; 
    bottom.Left::a = 3; 
    cout << bottom.Top::a << endl << bottom.Left::Top::a << endl;
    cout << bottom.Right::Top::a << endl << bottom.Left::a << endl;
    cout << bottom.Right::a << endl <<endl;

    cout << "And the addresses are: " << endl; 
    cout << " Bottom:       " << (void*)&bottom << endl; 
    cout << " Top:          " << (void*)static_cast<Top*>(&bottom) << endl;
    cout << " Left:         " << (void*)static_cast<Left*>(&bottom) << endl;
    cout << " Right:        " << (void*)static_cast<Right*>(&bottom) << endl;
    cout << " Top::a:       " << (void*)&bottom.Top::a << endl;
    cout << " Left::Top::a: " << (void*)&bottom.Left::Top::a << endl;
    cout << " Right::Top::a:" << (void*)&bottom.Right::Top::a << endl;
    cout << " Left::a:      " << (void*)&bottom.Left::a << endl;
    cout << " Rigth::a:     " << (void*)&bottom.Right::a << endl;
}; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 虚拟继承内存布局 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • Xcode UI 测试 - 使用 addSubview 添加的 Uiview 对于 UI 测试完全不可见

    我一直在尝试 XCode 7 3 上的新 UI 测试 并且发现了对我来说似乎是一个错误 问题是通过 添加的视图 添加子视图 方法对于UI测试系统来说似乎是完全不可见的 我有这样的看法 这个 UIview 创建代码 let container
  • 如何使用 *ngFor 迭代对象键?

    我一直在挖掘 发现我可以使用以下方法在对象上使用 ngFor div div where ObjNgFor管道是 Pipe name ObjNgFor pure false export class ObjNgFor implements
  • XHTML:将 DIV 放置在 A 标记中

    Is it alright将 div 标签放置在锚标签内 div 的内容会将页面重定向到锚标记的 href 吗 将 div 标签放在锚标签内可以吗 Yes if 您正在使用 HTML5 XHTML5 和 锚标记不在内联上下文中 即仅允许短语
  • 如何使用php从url读取xml文件

    我必须从 URL 读取 XML 文件 map url http maps google com maps api directions xml origin merchant address url destination customer
  • 从 PHP 中的函数返回多个值 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有这个函数 在调用它时返回三个值
  • Union 赋值中的不兼容类型

    Mypy 向我打印以下消息 x py 74 错误 赋值中的类型不兼容 表达式具有类型 Union str Dict str str 变量的类型为 str 是不是很奇怪 str是其一部分Union str Dict str str 代码如下
  • 从 PHP CLI 打开 Vim

    当你从提交命令中删除 m 时 如何从像 svn 和 git 那样的 CLI 打开 vim 我收到以下错误 Vim 警告 输出不是到终端 echo Please edit this file gt file name vim file nam
  • 如何使用 Perl 截取网页屏幕截图?

    是否可以用 Perl 编写一个脚本来打开不同的 URL 并保存每个 URL 的屏幕截图 你可以使用WWW 机械化 Firefox http search cpan org perldoc WWW Mechanize Firefox控制 Fi
  • 使用 FluentNHibernate 映射通用 EntityBase

    我的所有实体类型都有一个基类 就像 public abstract class EntityBase
  • 有谁知道这个Android类的功能吗? “com.google.apps.tiktok.tracing.db”?

    我正在使用 Android Studio Logcat 调试我自己的应用程序 并遇到一些涉及 com google apps tiktok tracing db 类的日志 这和抖音有关系吗 我从未在手机上安装过该应用程序 我的 Logcat
  • 压缩图像的最佳方法 Javascript React Web App

    我正在寻找最佳的解决方案来压缩我收到并需要存储在数据库中的图像 实际上 我将图像转换为base64 然后将其发送到服务器 handleImage e gt e preventDefault let reader new FileReader
  • 带有准备好的语句的 PostgreSQL 内部查询

    我有一个表来存储联系人 我想获取添加 user id 为 some number 的列的最大值 并将其设置为当前插入记录的相同列值 我正在使用准备好的语句 pg prepare db add INSERT INTO CONTACTS c u
  • 重置 FactoryGirl 测试的“序列”

    有谁知道如何重置FactoryGirl的序列方法 我有一个创建任务列表的工厂 我希望每次都从 1 开始 我使用 序列 是因为任务列表是一个关联模型 所以每次使用时我都需要增加顺序FactoryGirl create直到我调用重置 你需要写F
  • 在 Javascript 中检测 MS Surface 虚拟键盘

    有没有办法通过 Javascript 检测 MS Surface 的虚拟键盘何时显示在网页中 虚拟键盘覆盖了页面上的活动文本字段 我需要能够检测到这一点 以便我可以重新布局页面以更好地使用剩余的窗口区域 None
  • 仅通过单击节点图像来展开/折叠 TreeView

    我的表单上有一个包含大量项目 节点的 TreeView 当我双击节点的项目时 我运行一个过程 取决于单击的项目 我的问题是 我希望它仅在单击节点的图标 或 号 时展开 折叠 如果我双击一个项目则不会 类似的问题 http www delph
  • Ant构建执行cordova

    我为我的 cordova 项目创建了一个 ant 构建 如下所示
  • 如何使用 datafactory 管道转换 xml 数据

    我们如何将 XML 负载中的数据保存到 Blob 存储中 input
  • 对于 Jenkins git 插件,建议在哪里运行 git config ?

    在詹金斯的领导下我也有同样的情况longpaths中描述的问题这个线程 https stackoverflow com questions 22575662 filename too long in git for windows This
  • R Markdown 版本的 \framesubtitle?

    以下是我所知道的创建带有字幕的投影仪幻灯片的最少 TeXy 方法 output beamer presentation Title of Slide framesubtitle Subtitle of Slide Frame content
  • C++ 虚拟继承内存布局

    虚拟继承内存布局 我试图完全理解虚拟继承和 vTables vPtrs 的内存幕后发生的事情以及不发生的事情 我有两个我编写的代码示例 我确切地理解它们工作的原因 但我只是想确保我心中对对象内存布局有正确的想法 Here http post