C++ dynamic_cast

dynamic_cast应用于类的指针、类的引用或者 void*。 dynamic_cast运算符可以在执行期决定真正的类型。

  • 如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。
  • 如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
  • 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代替虚函数.