c++類型轉換關鍵字dynamic_cast和static_cast的使用區別

使用環境是ubuntu14.04

static_cast和dynamic_cast:

dynamic_cast的機制貌似是轉換出錯就返回NULL,測試過4種情況:

1) A* a = new B;

 B* b=dynamic_cast<B*>(a);

其中,a是b的父類,結果not null;

2) A* a = new B;

C*  c=dynamic_cast<C*>(a);

C是B的兄弟類,也繼承A,結果null;

3) B* b = new D;

C* c = dynamic_cast<C*>(b);

其中,D是B的子類,B和C是兄弟類,結果null;

4) A* a = new A;

E* e = dynamic_cast<E*>(a);

其中,E是不相關的類,結果null。

以上結果顯示出,除了第一種情況,dynamic_cast在其他轉換上雖然不會報錯,但轉換是無效的,這是因爲dynamic_cast是在運行的時候執行,沒法以編譯錯誤的形式顯示轉換錯誤,所以只能顯示空指針。

將以上情況全用static_cast轉換,會發現,1)和2)是not null,3)和4)會報錯。

綜上,對於下行轉換,dynamic_cast只能用於”指向派生類的父類指針轉換成對應的派生類指針“,而static_cast可用於父類向任意子類的下行轉換。

上述結論僅基於本次實驗結果,如果不妥之處,歡迎大家指出!


#include<iostream> 
#include<cstring> 
using namespace std; 
class A 

   public:
   int na; 
   virtual void f() 
   { 
       cout<<"hello"<<endl; 
       }; 
}; 
class B:public A 

    public:
    int nb; 
    void f() 
    { 
        cout<<"hello2"<<endl; 
        }; 
}; 
class C:public A 

  public:
  int nc;
  void f() 
  { 
      cout << "hello3" << endl; 
      }; 
}; 
class D:public B 

  public:
  int nd;
  void f() 
  { 
      cout << "hello4" << endl; 
      }; 
}; 
class E 

   public:
   int ne; 
   virtual void f() 
   { 
       cout<<"hello5"<<endl; 
       }; 
}; 
int main() 
{  
    A* a = new B;
    A* a2 = new A;
    B* b;
    B* b2 = new D; //D是B的子類
    C* c;
    C* c2; //C是B的兄弟類
    C* c3 = new C;
    D* d2;
    E* e;
    //dynamic_cast
    b=dynamic_cast<B*>(a2);//結果爲not null,對應1) 
    if(b==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    } 
    c=dynamic_cast<C*>(a);//結果爲null,對於2) 
    if(c==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    }
    c2=dynamic_cast<C*>(b2);//結果爲null,對應3)
    if(c2==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    }
    e=dynamic_cast<E*>(a2);//結果爲null,對應4)
    if(e==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    }
    //static_cast
    b=static_cast<B*>(a);//結果爲not null,對應1) ,將a改成a2,結果一樣
    if(b==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    } 
    c=static_cast<C*>(a2);//結果爲not null,對於2) 
    if(c==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    }
    /*c2=static_cast<C*>(b2);//報錯,對應3)
    if(c2==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    }
    e=static_cast<E*>(a2);//報錯,對應4)
    if(e==NULL) 
    { 
        cout<<"null"<<endl; 
    } 
    else
    { 
        cout<<"not null"<<endl; 
    }*/
    delete(c3);
    delete(b2);
    delete(a2); 
    delete(a);
    return 0; 
}

結果:

null
null
null
null
not null
not null



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章