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

    运行时类型识别(RTTI, Run-Time Type Identification)是 Java 中非常有用的机...

  • RTTI

    多态及可能存在的问题 多态是C++面向对象的三大特性之一,具体表现为: 即可以用父类的指针指向子类的对象。然而这也...

  • RTTI

    RTTI:run time type identification,运行时类型识别; 首先这个是个啥东西,其实就是...

  • 2018-04-07

    c++ 中的 RTTI RTTI是运行阶段类型识别(Runtime Typ...

  • 《JAVA编程思想》学习笔记:第14章(类型信息)

    第十四章、类型信息 14.1 RTTI RTTI:(Runtime Type Identification)运行阶...

  • RTTI和类型转换运算符

    1. RTTI RTTI是运行阶段类型识别(Runtime Type Identification)的简称。该特性...

  • RTTI下的C++的向下转型

    什么是RTTI? RTTI是“Runtime Type Information”的缩写,意思是:运行时类型信息。它...

  • 6.0 C++远征:运行时类型识别RTTI

    4-1运行时类型识别RTTI [TOC] 1.RTTI ​ Run-Time Type Identificat...

  • iOS开发 编译C++代码报错 typeinfo

    报错如下: 这是因为混用了no-RTTI代码和RTTI代码需要在 Xcode--> Build Settings ...

  • 浅谈 RTTI

    什么是 RTTI? RTTI 即 Runtime Type Information,顾名思义,也就是在运行时,识别...

网友评论

    本文标题:RTTI

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