运行时类型识别

来源:互联网 发布:犀牛软件制作杯子 编辑:程序博客网 时间:2024/05/17 22:25

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值
0 0
原创粉丝点击