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的主要内容,如果未能解决你的问题,请参考以下文章