dynamic_cast应用于类的指针、类的引用或者 void*。 dynamic_cast运算符可以在执行期决定真正的类型。
基类指针下转时,如果发现指向的不是一个发生在多态中的子类对象,则会返回 NULL指针以后判断使用。
#include <iostream> using namespace std; class A { public: virtual ~A(){} }; class B:public A{}; class C:public A{}; class D{}; //downcast no-relation int main(int argc, char *argv[]) { // if(typeid(*pa) == typeid(b)) B b; A *pa = &b; B* pb = dynamic_cast<B*>(pa); if(pb != NULL) cout << "pb != NULL" << endl; else cout << "pb == NULL" << endl; C *pc = dynamic_cast<C*>(pa); if(pc != NULL) cout << "pc! = NULL" << endl; else cout << "pc == NULL" << endl; D *pd = dynamic_cast<D*>(pa); if(pd != NULL) cout << "pc! = NULL" << endl; else cout << "pc == NULL" << endl; return 0; }
在什么情况下你应该使用dynamic_case替代虚函数?
如果我们需要在派生类中增加新的成员函数f,但又无法取得基类的源代码,因而无法在基类中增加相应的虚函数,这时,可以在派生类中增加非虚成员函数,但这样一来,就无法用基类指针调用函数f,如果在程序中需要通过基类指针(如使用该继承层次的某个类中所包含的指向基类对象的指针数据成员p)来调用f,则必须使用dynamic_cast将p转换为只想派生类的指针,才能调用f,也就是说,如果无法为基类增加虚函数,就可以使用dynamic_cast代替虚函数.