Lession 26 RTTI (Run Time Type Identification)
2014-08-22 13:15
274 查看
RTTI 运行时类型识别
static_cast<目标类型> 强制类型转换:内存截断时可以,内存扩充会有不可预料的内存读取;如:基类指针指向基类对象,再被强制类型转换成子类指向,调用子类成员,可能有问题(内存扩充)
当基类指针或引用指向派生类的派生类时,基类指针转换成派生类时是安全的,有时不然; (派生类的派生类会改变虚函数表,用派生类的指针调用虚函数时,调用的是派生类的派生类的虚函数)
dynamic_cast<目标类型>
RTTI就是为了完成这个功能:在类型转换的时候,识别指针是指向基类还是子类,如果是基类,则不转换,如果是子类,则转换;
pd = dynamic_cast<Derived *>(*pb);
// 基类的指针或是引用转换到子类的指针或是引用; 转换过程会检查是否有效,有效则转换,无效则不转换,并抛出异常
// dynamic_cast的操作数必须是含有虚函数的自定义类型;
// 只能用于指针或引用的转换,不能转换对象
// 安全转换,向下转换
if(pd) // 安全则转换,否则不转换
{
// to do
}
return 0;
typeid操作符
#include <typeinfo>指示了RTTI时的类型;
typeip(expression) : 用于获取一个表达式的类型; 返回type_info对象的引用;
int ival;
cout<<typeip(ival).name()<<endl; // int
typeip:
不能定义type_info的对象,只能定义引用或是指针;
// 可以通过将构造函数放在private / protected里面,这样就可以限制其实例化对象;
如果想通过基类来判断子类的类型,typeid操作数必须是含有虚函数成员的基类;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),
而pd2将是一个空指针。
RTTI要看基类的指针实际指向的是子类对象还是基类对象;
相关文章推荐
- [书摘]Issues about RTTI (Run Time Type Identification)
- 从头认识java-12.1 为什么需要RTTI(Run-Time Type Identification)?
- 行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制 多态 类加载
- 从头认识java-12.1 为什么需要RTTI(Run-Time Type Identification)?
- 迷思微软两大框架的RTTI(Run-Time Type Identification)
- Advanced Run Time Type Identification in C++ Part II(Property Library An Implementation of RTTI in C++)
- RTTI(Run-Time Type Identification)
- RTTI(Run-time Type Identification)
- ABAP RTTI(Run Time Type Identification)介绍与反射机制
- c++模拟MFC中运行时类型识别(RTTI)(Run-Time Type Identification)
- RTTI (Run-Time Type Identification,通过运行时类型识别)
- RTTI(Run-Time Type Identification)、虚函数和虚基类的实现方式、开销分析及使用指导
- RTTI的魅力(运行时类型识别 Run-time type Identification)
- The C++ Standard Library: RTTI(Run-Time Type Identification,运行时类型识别)
- RTTI(Run-Time Type Identification,通过运行时类型识别)
- C++ Run-Time Type Identification(RTTI)运行时类型识别
- Run-time type information--RTTI
- RTTI (Run-time type information) in C++
- C++虚函数(8) - RTTI(Run-time type information)
- RTTI(Run-Time Type Information,通过运行时类型信息) 运行期类型检查