dynamic_cast与原理
dynamic_cast
运算符能够将基类的指针或引用安全的转换为派生类的指针或者引用。转换失败,返回空地址。
RTTI是运行阶段类型识别(Runtime Type Identification)的简称。是指程序在运行阶段确定对象的类型。
C++中可以进行运行时识别出变量等类型信息的还有typeid
。
编译环境
Visual Studio 2022 / v143 / C++20
dynamic_cast用法
转换成功
如下B继承自A
struct A
{
virtual ~A(){
}
};
struct B: A{
};
A* a = new B;
// 将指向子类的指针,转换为子类指针。
if (b = dynamic_cast<B*>(a)) {
// do something...
}
转换失败
A* a = new A;
// 转换失败,b为空指针。
if (b = dynamic_cast<B*>(a)) {
// do something...
}
```
原理探究
使用dynamic_cast转换的前提是A必须有虚函数,即虚函数表。dynamic_cast
的关键就是虚函数表,因为B类有自己的虚函数表,A类也有自己的虚函数表,根据虚函数表的不同可以判断到底是属于哪个类。我们简单仿写一下。当然,我们只是尝试一下,不能用于实际,毕竟开销大且有局限性。
template<class T>
int64_t