C/C++教程

C++ dynamic_cast

本文主要是介绍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代替虚函数.

这篇关于C++ dynamic_cast的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!