您的位置:首页 > 其它

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指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;

但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),

而pd2将是一个空指针

RTTI要看基类的指针实际指向的是子类对象还是基类对象;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: