C++ 什么是运行时类型信息?
运行时类型信息(RTTI),也被称为运行时类型识别(RTI),是几种编程语言(如C++、Object Pascal和Ada)的一个特征,它使对象的数据类型在运行时可用。运行时类型信息有可能被提供给所有类型,或者只提供给那些明确拥有它的类型(如Ada的情况)。一个叫做类型自省的更广泛的想法被专门用于运行时类型知识。
运行时类型信息并不是最初C++设计的一部分,因为Bjarne Stroustrup认为它经常被滥用。
简而言之,运行时类型信息,或C++中的RTTI,是一种机制,它使对象的数据类型信息在运行时可用,并且只对包含至少一个虚拟函数的类可用。它使程序执行能够确定一个项目的类型。
什么是运行时转换?
使用指针或引用来确定一个对象的运行时类型,最简单的方法是使用运行时转换,它可以验证转换是否合法。如果我们需要将一个指针从一个基类投向另一个基类,这就非常有用。在处理决定其继承性的类的层次结构时,通常需要对一个对象进行铸造。铸造有两种情况。
- 上投– 当一个基类的指针被用来处理一个派生类对象的指针或引用时。
- 下投– 当基类的引用或指针被改变为派生类的指针时。
使用 “动态转换”。在继承的层次结构中,它被用来将基类的指针向下投到子类。如果投递成功,它将返回一个转换类型的指针。如果我们试图铸造一个无效的类型,例如一个不属于预定子类类型的对象指针,就会失败。
概述
通过使用C++中的动态cast>操作符,可以进行安全的类型转换,并且可以使用typeid操作符和std::type info类来实时修改类型信息。安全的类型转换可以在Object Pascal中使用as操作符来进行。is操作符可以用来确定一个对象所属的类,RTTI单元的类可以用来在运行时改变类型信息(即类:TRttiContext,TRttiInstanceType,等等)。在Ada中,具有标记类型的对象也会跟踪一个类型标签,允许运行时的类型识别。如果一个对象属于某种类型并且可以正确地转换为该类型,那么它就可以在运行时用in操作符进行测试。只有多态类–即包括至少一个虚拟方法的类–才能使用RTTI。在现实中,这并不是一个限制,因为基类需要有虚拟的析构器,以便派生类的对象在从基类指针中被销毁时可以执行正确的清理。
一些编译器具有使RTTI不可操作的标志。在为内存有限的系统设计应用程序时,这些标志非常有帮助,因为它们可以将应用程序的总体大小降到最低。
什么是C++ typeid?
一个对象的类别可以在运行时通过typeid关键字来确定。在程序完成后,它返回一个指向std::type info对象的指针。在只需要类信息的非多态环境中,typeid经常比动态投类type>更受欢迎,因为typeid总是一个恒定的时间过程。例如,std::type info::name()是实现定义的,不能相信它能在不同的编译器之间保持一致。
当在一个空指针上使用单数操作符来创建typeid表达式时,会抛出std::bad typeid类的对象。特定于实现的因素决定了是否会对额外的无效引用参数产生异常。换句话说,表达式必须具有 typeid(p) 的形式,其中 p 是产生空指针的任何表达式。
什么是C++动态铸造和java铸造?
在C++中,一个引用或指针可以通过动态投掷操作符下移到类的层次结构中一个更精确的类型。与静态转换不同,动态转换的目标必须是一个指向类的指针或引用。类型安全检查是在运行时进行的,而不是静态cast和C-style typecast,后者是在编译时进行类型检查。当处理引用时,将抛出一个异常,或者如果类型不兼容(当处理指针时),将返回一个空指针。
与此类似,一个Java类型转换将抛出一个java.Lang.ClassCastException实例,如果被转换的对象实际上不是目标类型的一个实例,并且不能通过语言定义的方法转换为目标类型。