RTTI

作者: iamsonormal2333 | 来源:发表于2016-10-02 17:26 被阅读31次

    多态及可能存在的问题

    多态是C++面向对象的三大特性之一,具体表现为:

        class GrandFather{//has virtual methods};
        class Father : public GrandFather {...};
        class Son : public Father {...};
        GrandFather *p1 = new Son;//#1
        GrandFather *p2 = new Father;//#2
        GrandFather *p3 = new GrandFather;//#3
    
    

    即可以用父类的指针指向子类的对象。
    然而这也会导致一些问题。

        Son *p4 = (Son *)p3;//#4
    

    显然,第四句是不安全的,因为他试图将GrandFather对象的地址赋给一个派生类(Son)指针。因此,程序将期望基类对象有派生类的特征,而通常这是不可能的。例如Son可能包含一些GrandFather对象中没有的数据成员。
    解决方法:RTTI
    =============
    RTTI是运行阶段类型识别的简称,被用来实现跟踪生成对象的类型。首先介绍RTTI的三个元素。

    1.dynamic_cast运算符
    dynamic_cast运算符是最常用的RTTI组件,他不能回答指针是哪类对象这种问题,但能回答是否能安全的将对象的地址赋给特定类型的指针。

        Father *p5 = dynamic_cast<Father *>p1;
    

    p1指针指向了一个对象,如果p1指针类型可以被安全地转换成Father *,则运算符将会返回对象地址,否则将返回空指针。
    2.typeid运算符和type_info类
    typeid运算符确定两个对象是否时同种类型。typeid运算符会返回一个type_info对象的引用。type_info类在头文件typeinfo中定义,重载了==和!=运算符,以便进行比较。

        typeid(Son) ==typeid(*p1);
    

    如果p1指向一个Son类型,则结果为true,如果p1为空指针,则将会引发异常,否则将会返回false。
    type_info类包含一个name( )成员,将会返回一个类名称的字符串

        cout<<typeid(*p1).name();
    

    typeid不是类的方法,不能使用类的方式来调用。typeid运算符适用于dynamic_cast不能处理的情况。typeid一般被用在调试之中。

    相关文章

      网友评论

        本文标题:RTTI

        本文链接:https://www.haomeiwen.com/subject/vvqdyttx.html