运行时类型识别

本文介绍了运行时类型识别(RTTI)的概念及其在C++中的应用,包括typeid操作符的功能与用法,以及dynamic_cast操作符如何进行类型转换与验证。通过实例展示了正确的使用方法与注意事项。

Q1:运行时类型识别(RTTI)简述

• 通过下面两个操作符实现RTTI:

1) typeid 操作符,返回指针或引用所指对象的实际类型

2) dynamic_cast操作符,将基类类型的指针或引用安全的转换为派生类型的指针或引用

对于带虚函数的类,在运行时执行RTTI操作符,对其他类型,在编译时计算RTTI操作符

Q2:dynamic_cast 操作符

• dynamic_cast操作符一次执行两个操作:验证,转换。只有验证被请求的转换有效后,才会进行类型转换

• 如果检测过程中发现转换无效,分为以下两种情况:

1) 若转换到指针类型失败,则 dynamic_cast 的结果是 0 值(值为 0 的指针转换结果也为0)

2) 若转换到引用失败,则抛出一个 bad_cast 类型的异常

• 推荐使用方法:

if (Derived * derivedPtr = dynamic_cast<Derived*>(basedPtr))
    {

    }
    else
    {

    }

三个好处:

1) 在 if 内部才会执行派生内操作,在 else 中执行基类操作
2) 保证转换与结果测试在同一个表达式中进行
3) 在 if 外部不能访问该指针

Q3:typeid操作符

• typeid(e),此处的 e 是任意表达式或类型名

• 如果操作数不是类类型或是没有虚函数的类,则typeid操作符指出操作数的静态类型;若操作数是定义了一个以上的虚函数的类类型,在运行时计算类型

• 只有当操作数是含有虚函数的类类型对象的时候,才返回动态类型信息;若测试指针,返回的是指针静态编译时类型

○ if( typeid ( *bp) == typeid ( Derived ))      //正确写法

○ if ( typeid (bp) == typeid ( Derived ))      //错误写法,此时判断 Base* 与 Derived

• typeid 操作符提供以下几个操作:

    1) t1 == t2;

    2) t1 != t2;

    3) t.name();                //返回C风格字符串,这是类型名字的可显示版本

    4) t1.before(t2);        //返回指出  t1 是否出现在 t2 之前的 bool值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值