C++ C++;类型信息

C++ C++;类型信息,c++,polymorphism,typeinfo,C++,Polymorphism,Typeinfo,我将从java转到cpp,我在理解一些cpp特性是如何工作的方面有点问题。当我们使用多态性或类型安全转换时,cpp需要知道对象的确切类型。在java中,每个对象都有一个指向其定义类的链接,因此可以检索这些信息。但在cpp中,情况并非如此(我认为),因为sizeof()运算符返回的值不超过对象字段所占用的值,因此我猜类型信息不是存储在这里的。 我弄错了吗?如果否,那么cpp如何管理多态性和其他内容?C++多态性仅限于虚拟函数。实现虚拟函数所需的只是一个类通用的函数指针表,通常称为vtable。指向

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

C++多态性仅限于虚拟函数。实现虚拟函数所需的只是一个类通用的函数指针表,通常称为vtable。指向vtable的指针将添加到每个对象,但vtable本身对于同一类的所有对象都是通用的


<>注意VC++的使用不是由C++标准规定的,但在实践中几乎是通用的。实现虚拟函数所需的只是一个类通用的函数指针表,通常称为vtable。指向vtable的指针将添加到每个对象,但vtable本身对于同一类的所有对象都是通用的


注意到VTE的使用不是由C++标准规定的,但在实践中几乎是通用的。

< P> C++仅能够对具有虚拟方法的类型执行动态类型内省;与爪哇不同,C++方法默认为非虚的。 向类添加虚拟方法的(通常)结果是编译器在类结构中发出一个额外的隐藏槽,其中包含指向vtable的指针;vtable包含用于虚拟方法的方法指针的插槽和指向动态类型信息的附加指针。vtable的使用方式如下:

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

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

C++只能对具有虚拟方法的类型执行动态类型内省;与爪哇不同,C++方法默认为非虚的。 向类添加虚拟方法的(通常)结果是编译器在类结构中发出一个额外的隐藏槽,其中包含指向vtable的指针;vtable包含用于虚拟方法的方法指针的插槽和指向动态类型信息的附加指针。vtable的使用方式如下:

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

指向VTSIT槽的指针意味着如果一个类(或它的基类)有虚方法,那么 SeZOOS将大于对象成员字段的和。

< P>你问的是反射,而不是,C++没有它,它不是故意的。Stroustrop看到其他语言中的对象不断地用“what is you”(你是什么)之类的消息相互查询,这是某种崩溃的迹象。偶然地,通过元编程可以获得的反射量是有限的

有一种方法可以在C++中反射不足。对空*的动态强制转换提供指向最派生对象的指针。所以现在你只需要理解这个指针。如果您有自己的类型管理系统,则可以执行此操作。它并不简单,它几乎不可避免地打破了语言的规则,但它经常被用于检查点/重新启动的目的。

< p>你问的是反射,不,C++没有它,它不是故意的。Stroustrop看到其他语言中的对象不断地用“what is you”(你是什么)之类的消息相互查询,这是某种崩溃的迹象。偶然地,通过元编程可以获得的反射量是有限的


有一种方法可以在C++中反射不足。对空*的动态强制转换提供指向最派生对象的指针。所以现在你只需要理解这个指针。如果您有自己的类型管理系统,则可以执行此操作。它并不简单,它几乎不可避免地打破了语言的规则,但它经常被用于检查点/重新启动的目的。

< P> C++,这是一个很好的实践,不使用RTTI,你可以编写真正的大型应用程序而不用它。您应该知道对象的类型,并将它们转换为适当的类型。在java中,可以使用if(ObjistSistar类){},但是C++中,你希望看到这样的代码,甚至可以写。C++中的P>< P>