dynamic_cast用法
语法
dynamic_cast<type-name>(expression)
判断是否可以安全地将对象的地址赋给特定类型的指针。如果可以返回地址否则返回空指针。
可以将有继承关系的派生类对象的地址赋给基类指针。即使基类中没有虚函数也可以使用dynamic_cast。如果将没有继承关系的对象的地址赋给另一个类的指针, 编译器会报错。
请看代码
#include<cstdio> class Base{ int dat; public: explicit Base(int val) : dat(val){ printf("%s, this=%p\n", __func__, this); } #if 0 virtual void act(){ #else void act(){ #endif printf("%s, this=%p\n", __func__, this); } }; class Sub : public Base{ public: explicit Sub(int val) : Base(val){ printf("%s, this=%p\n", __func__, this); } }; class Other{ int dat; public: explicit Other(int val) : dat(val){ printf("%s, this=%p\n", __func__, this); } }; int main(){ Base obase(1); Sub osub(2); Base *pbase = NULL; if(pbase = dynamic_cast<Base *>(&osub) ){ pbase->act(); } #if 0 Other oother(3); //error: cannot dynamic_cast & oother (of type class Other*) to type class Base* //(source type is not polymorphic) if(pbase = dynamic_cast<Base *>(&oother) ){ //pobj was not declared in this scope pobj->act(); pobj->act(); } #endif }
测试结果
[email protected]:~/project/test/cpp/rtti$ ./a.out
Base, this=0x7fffe85b2ed0
Base, this=0x7fffe85b2ee0
Sub, this=0x7fffe85b2ee0
act, this=0x7fffe85b2ee0
时间: 2024-10-17 23:25:24