C++运行时类型识别——RTTI

RTTI

通过运行时类型识别——RTTI,程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类类型:

其主要通过两个操作符来实现:

1.typeid——返回指针或引用所指对象的实际类型;

2.dynamic_cast——将基类类型的指针或引用安全地转换为派生类型的指针或引用;

dynamic_cast

当无法为基类增加虚函数,又要使用基类的指针或引用调用派生类的函数时,可以使用该操作符代替虚函数。

与dynamic_cast一起使用的指针必须是有效的——它必须为0或者指向一个对象。

与其他强制类型转换不同,dynamic_cast涉及运行时类型检查,,它一次执行两个操作:1.它首先验证被请求的转换是否有效,即绑定到引用或者指针的对象必须为目标类型的对象(或其派生的对象),若不是,则绑定失败,当绑定失败时,如果转换到的是指针类型,则返回的结果是0,如果转换到的是引用类型,则抛出一个bad_cast类型的异常。该异常在typeinfo头文件中定义;2.只有验证转换有效时,才实际进行转化,且转换实在运行阶段而不是编译阶段;

typeid

typeid操作符能够问一个表达式得出其类型。

其表达形式如:typeid(e)

e可以是仍以表达式或者类型名,如果是类类型且该类包含一个或多个函数,则表达式的动态类型可能不同于其静态类型,该操作符会在运行时计算其类型,如果是表达式(内置类型或常量),则该操作符将指出e的静态类型。

typeid操作符的结果是名为type_info的标注库类型的对象引用,它包含在头文件typeinfo中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 06:59:38

C++运行时类型识别——RTTI的相关文章

MFC中的运行时类型识别(RTTI)

RTTI是Runtime Type Identification的缩写,中文名为"运行时类型识别". MFC早在编译器支持RTTI之前,就有了这种能力.我们现在要以相同的手法,在Console程序中仿真出来.我希望我的类库具备IsKindOf 的能力,能在执行期侦测到某个对象是否属于某个类,并传回TRUE 或 FALSE.以形状 Shape为例 ,我希望: 即 长方形属于"长方形类",正方形属于"长方形类",圆不属于"长方形类"

C++学习之显示类型转换与运行时类型识别RTTI

static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情况一样? 什么情况下使用dynamic_cast代替虚函数? typeid 命名的强制类型转换形式如下: cast_name<type>(expression); 其中:cast_name指static_cast.dynamic_cast.const_cast.reinterpret_cast中的

运行时类型识别RTTI

1.RTTI的工作原理 例1. 用Class加载对象示例. package RTTI; public class Candy { static{ System.out.println("Loading Candy in static block."); } public static void main(String[] args) { System.out.println("Loading Candy in main method."); } } package

Java基础之RTTI 运行时类型识别

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于RTTI实现的.RTTI的功能主要是由Class类实现的. Class类 Class类是"类的类"(class of classes).如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合. 每一个Class类的对象代表一个其他的类.比如下面的程序中,Class类的对象c1代

运行时类型识别

1.RTTI 1)运行时类型识别RTTI(Run-Time Type Identification),它能够获取基类指针或引用所指向的对象的实际类型,在C++中,为了支持RTTI提供了两个运算符:typeid和dynamic_cast 2) 2.dynamic_cast 2.1概念 1)dynamic_cast运算符用于将基类的指针或引用安全地转换成派生类的指针或引用,这是安全的“向下转型”,至于“向上转型”,即派生类指针或引用转换为其基类指针或引用,本身就是安全的,尽管可以使用dynamic_

RTTI 运行时类型识别

RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3.转换成功返回的是子类的地址,失败返回NULL typeid注意事项: 1.typeid返回一个type_info对象的引用 2.如果想通过基类获得派生类的数据类型,基类必须带有虚函数 3.只能获取对象的实际类型

C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert> struct B {} b, c; struct D : B {

MFC 六大机制 (2) RTTI(运行时类型识别)

RTTI(Runtime Type Identification,运行时类型识别) 程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.MFC 早在编译器支持 RTTI 之前,就具有了这项能力.承接上一章,我们现在要在 Console 程序中将 RTTI 仿真出来.我希望我的类库具备 IsKindOf() 的能力,能够在执行器检查某个对象是否"属于某种类",并传回 TRUE 或 FALSE.为了更直观地查看结果,我在 IsKindOf() 中加入了输出,使其达到如

【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert>