zoukankan      html  css  js  c++  java
  • 《C++ Primer Plus》15.4 RTTI 学习笔记

    运行时类型识别RTTI(Runtime Type Identification)

    C++有三个支持RTTI的元素。
    * 如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该运算符返回0——空指针。
    * typeid运算符返回一个指出对象的类型的值。
    * type_info结构存储了有关特定类型的信息。
    只能将RTTI用于包含虚汗数的类层次结构,原因在于只有对于这种类层次结构,才应该将派生对象的地址赋给基类指针。

    1.dynamic_cast运算符
    dynamic_cast运算符 可以回答 “是否可以安全地将对象的地址赋给特定类型的指针”。
    假设有下面这样的类层次结构:
    class Grand {// has virtual methods };
    class Superb : public Grand { ... };
    class Magnificicnt : public Superb { ... };
    dynamic_cast运算符的语法如下,其中pg指向一个对象:
    Superb * pm = dynamic_cast<Superb *>(pg);
    这提出了这样的问题:指针pg的类型是否可被安全地转换为Superb *>如果可以,运算符将返回对象的地址,否则返回一个空指针。
    注意:通常,如果指向的对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则下面的表达式将指针pt转换为Type类型的指针:
    dynamic_cast<Type *>(pt)
    否则,结果为0,即空指针。

    2.typeid运算符和type_info类
    typeid运算符使得能够确定两个对象是否为同种类型。它与sizeof有些相像,可以接受两种参数:
    * 类名;
    * 结果为对象的表达式。
    typeid运算符返回一个对type_info对象的引用,其中,type_info是在头文件typeinfo(以前为typeinfo.h)中定义的一个累。type_info类重载了==和!=运算符,一边可以使用这些运算符来对类型进行比较。例如,如果pg指向的是一个Magnificent对象,则下述表达式的结果为bool值true,否则为false:
    typeid(Magnificent) == typeid(*pg)
    如果pg是一个空指针,程序将引发bad_typeid异常。
    type_info类的实现随厂商而异,单包含一个name()成员,该函数返回一个随实现而异的字符串:通常(单并非一定)是类的名称。例如,下面的语句显示指针pg指向的对象所属的类定义的字符串:
    cout << "Now processing type " << typeid(*pg).name() << ". ";

  • 相关阅读:
    Qt-不规则窗口
    Qt-绘图设备
    Qt-绘图
    许久不做前端, 偶尔看一下前端开发中的单元测试框架.
    美国6w刀的远程工作高级工程师职位,说下在线评估, 倒在第一阶段, 认知能力测试?智商不够怎么办?!
    这次说一下mysql协议的数据库中间件mycat集群方案.
    古人说, 凡事预则立, 不预则废, 设计要精确到每个细节.
    探索产品经理之路.
    今天我们看一下caloch.cn的邮件问题
    We go for our interest in drawing manga characters.
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5670841.html
Copyright © 2011-2022 走看看