gpt4 book ai didi

C++ 类型信息

转载 作者:行者123 更新时间:2023-11-30 01:25:54 26 4
gpt4 key购买 nike

我正从 java 转向 cpp,但我在理解某些 cpp 功能的工作原理时遇到了一些问题。当我们使用多态或类型安全转换时,cpp 需要知道对象的确切类型。在 java 中,每个对象都有一个指向其定义类的链接,因此可以检索此信息。但在 cpp 中情况并非如此(我认为),我是说因为 sizeof() 运算符返回的不超过对象字段占用的内容,因此我猜这不是存储类型信息的地方。我在这里弄错了吗?如果不是,那么 cpp 如何管理多态性和其他东西?

最佳答案

C++ 只能对具有虚方法的类型执行动态类型自省(introspection);与 Java 不同,C++ 方法默认是非虚拟的。

向类添加虚方法的(通常)结果是编译器在类结构中发出一个额外的隐藏槽,其中包含指向vtable 的指针; vtable 包含用于虚拟方法的方法指针的插槽和指向动态类型信息的附加指针。 vtable 的使用方式如下:

  • 在实例上调用虚拟方法将遵循 vtable 并通过适当的 vtable 方法槽调用;
  • 在具有虚方法的类的实例上调用typeid 将遵循指向动态类型信息的 vtable 指针确定实例的实际(动态)类型;
  • 在具有虚方法的类的实例上调用dynamic_cast 将跟随 vtable 指针指向动态类型信息,并使用它来调整实例指针;这是必要的,因为 C++ 允许多重继承,因此指向同一对象的不同类型的指针可能指向内存中的不同位置。

指针到 vtable 槽意味着如果一个类(或其基类)具有虚拟方法,则 sizeof 将大于对象成员字段的总和。

关于C++ 类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com