dynamic_cast用于具有虚函数的基类与派生类之间的指针或引用的转换。
使用的情况:
(1)基类必须具备虚函数
原因:dynamic_cast是运行时类型检查,需要运行时类型信息(RTTI),而这个信息是存储与类的虚函数表关系紧密,只有一个类定义了虚函数,才会有虚函数表。
(2)运行时检查,转型不成功则返回一个空指针
(3)非必要不要使用DYNAMIC_CAST,有额外的函数开销
1.父类转子类情况下的越界问题:
#include#include //基类与派生类之间的转换 class CFather { public: CFather() { m_nTest = 3; } virtual void foo() { std::cout << "CFather()::void foo()" << std::endl; } int m_nTest; }; class CSon : public CFather { public: virtual void foo() { std::cout << "CSon::void foo()" << std::endl; } int m_nSon; }; int main() { CFather f; CSon s; CFather* pFather = &f; CSon* pSon = &s; //向下转换,父类转子类,不安全 //父类:虚表+成员变量共8个字节,转换为子类后有12个字节 //编译器判断其为子类型,因此在做赋值时就会越界 //运行时才会发现 pSon = static_cast (pFather); pSon->m_nSon = 123; //向上准换,子类转父类,安全 pFather = static_cast (pSon); }
赋值前:
赋值后:
原因:父类,虚表+成员变量共8个字节,转换为子类后有12个字节,编译器判断其为子类型,因此在做赋值时就会越界。
发现的阶段:运行时才会发现。
那有没有办法利用一种语法来检测这种不安全行为呢?
2. dynamic_cast
用于具有虚函数的基类与派生类之间的指针或引用的转换。运行时检测转换是否安全。
(1)如下图为使用dynamic_cast后检测到向下转换的情形,因此返回一个空指针。
(2)其本质是依赖RTTI:运行时类型检测技术
属性中进行设置:
跳转的本质:
因为这种技术需要调用RTTI的函数,有额外的开销,一般而言只要向下转换时才是用
(3)使用的情形:
因为这种技术需要调用RTTI的函数,有额外的开销,一般而言只要向下转换时才使用。简单一些说就是:具有多态类类型的向下转换时使用
3.学习视频地址:强制转换dynamic_cast
4.学习笔记:强制转换dynamic_cast笔记



