C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI相关的知识,希望对你有一定的参考价值。

1. 运行时类型识别(run-time type identification )

当我们将这两个运算符用于某种类型的指针或引用, 并且该类型含有虚函数时, 运算符将
使用指针或引用所绑定对象的动态类型

  • typeid 运算符, 用于返回表达式的类型。
  • dynamic_cast 运算符, 用于将基类的指针或引用安全地转换成派生类的指针或引用

2 dynamic_cast运算符 :

type类型必须时一个类类型,并且通常情况下该类型应该含有虚函数。

dynamic_cast<type*>(e)  // e必须是一个有效的指针
dynamic_cast<type&>(e)  // e必须是一个左值
dynamic_cast<type&&>(e) // e不能是左值

2.1 e的类型要求

必须符合三个条件中的任意一个,它们是:

  • e的类型是目标type的公有派生类;
  • e的类型是目标type的共有基类;
  • e的类型就是目标type的类型;

如果一条 dynamic_cast 语句的转换目标是指针类型并且失败了, 则结果为 0。 如果转换目标是引用类型且失畋了,dynamic_cast 运算符将抛出一个 bad_cast 异常

可以对一个空指针执行dynamic_cast,结果是所需类型的空指针

2.2 指针类型的 dynamic_cast

// 指针类型的dynamic_cast
// 假设Base类至少含有一个虚函数,Derived是Base的共有派生类。
if (Derived *dp = dynamic_cast<Derived*>(bp)) {
    // 使用dp指向的Derived对象
} else {    // bp指向一个Base对象
    // 使用dp指向的Base对象
}

2.3 引用类型的 dynamic_cast

void f(const Base &b) {
    try {
        const Derived &d = dynamic_cast<const Derived&>(b);
        // 使用b引用的Derived对象
    } catch (bad_cast) {
        // 处理类型转换失败的情况
    }
}

以上是关于C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI的主要内容,如果未能解决你的问题,请参考以下文章