C++ 运行时类型信息是什么

C++ 运行时类型信息是什么

运行时类型信息(RTTI),也被称为运行时类型识别(RTI),是几种编程语言(如C++、Object Pascal和Ada)的特性,使得在运行时可以获得有关对象数据类型的信息。运行时类型信息可以对所有种类的类型都可用,也可以仅对具有明确定义的类型可用(如Ada所示)。更广泛的概念称为类型内省,专门应用于运行时类型知识。

运行时类型信息并不是最初的C++设计的一部分,因为Bjarne Stroustrup认为它经常被滥用。

简而言之,C++中的运行时类型信息(RTTI)是一种使得在运行时可获得有关对象数据类型的机制,仅对包含至少一个虚函数的类可用。它使得程序执行可以确定一个项目的类型。

什么是运行时类型转换

使用指针或引用来确定对象的运行时类型的最简单方法是使用运行时类型转换,它验证类型转换是否合法。这在需要将一个基类指针强制转换为另一个基类时非常有用。当使用确定其继承关系的类层次结构进行工作时,通常需要对象的转换。类型转换有两种方式:

  1. 向上转型 – 使用基类指针来处理指向派生类对象的指针或引用。
  2. 向下转型 – 将基类的引用或指针转换为指向派生类的指针。

使用 “dynamic_cast” :在继承的层次结构中,它用于将基类指针转换为子类。如果转换成功,它将返回转换后类型的指针。如果我们尝试转换为无效类型,例如一个不属于所需子类类型的对象指针,它将失败。

概述

通过在C++中使用dynamic_cast>运算符,可以执行安全的类型转换,并且可以使用typeid运算符和std::type_info类来实时修改类型信息。在Object Pascal中,可以使用as运算符执行安全类型转换。is运算符可用于确定对象所属的类,可以使用RTTI单元中的类来在运行时修改类型信息(即类:TRttiContext、TRttiInstanceType等)。在Ada中,具有标签类型的对象也会跟踪类型标签,从而实现了运行时类型识别。如果对象是某个类型且可以正确转换为它,可以使用in运算符来在运行时进行测试。只有多态类-即至少包含一个虚方法的类-才能使用RTTI。事实上,这并不是一种限制,因为基类需要有虚析构函数,以便从基指针销毁时,派生类对象能够正确执行清理工作。

一些编译器可以使用标志使RTTI无效。在为内存有限的系统设计应用程序时,这些标志非常有用,因为它们可以减小应用程序的总体大小。

C++中的typeid是什么

通过使用typeid关键字可以在运行时确定对象的类。在程序完成后,它返回一个指向std::type_info对象的指针。在非多态环境中,只需要类信息,经常优先使用typeid而不是dynamic_cast类的类型,因为typeid总是一个常量时间的过程。相比之下,动态转换可能需要在运行时导航其输入的类派生格子。例如,std::type_info::name()是实现定义的,不能保证在编译器之间保持一致。

当在空指针上使用一元运算符*来创建typeid表达式时,将抛出std::bad_typeid类的对象。实现特定因素决定是否为额外的无效引用参数引发异常。换句话说,表达式必须具有形式typeid(*p),其中p是产生空指针的任何表达式。

C++动态转换和Java转换是什么

在C++中,可以使用dynamic_cast运算符将引用或指针向下转换为类层次结构中更精确的类型。与静态转换不同,动态转换的目标必须是指向类的指针或引用。运行时执行类型安全检查,而不是静态转换和C风格类型转换,在编译期间执行类型检查。当处理引用时,如果类型不兼容(处理指针时)则会抛出异常或返回空指针。

与此类似,Java类型转换将抛出java.lang.ClassCastException实例,如果被转换的对象实际上不是目标类型的一个实例,并且不能通过语言定义的方法转换为目标类型。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程