C++中的向上類型轉換和向下類型轉換

在c++的世界中有這樣兩個概念,向上類型轉換,向下類型轉換,分別描述的是子類向基類,和基類向子類的強制類型轉換。

向上強制類型轉換

切割:覆蓋方法和子類數據丟失的現象生成切割(slice)

  1. class Base  
  2. {  
  3. public:  
  4.  int b;  
  5.  virtual void Test()  
  6.  {  
  7.   cout << "base" <<endl;  
  8.  }  
  9. };  
  10.   
  11. class Derived:public Base  
  12. {  
  13. public:  
  14.  int d;  
  15.  virtual void Test()  
  16.  {  
  17.   cout << "derived" <<endl;  
  18.  }  
  19. };  
  20.   
  21. int main()  
  22. {  
  23.   Derived d;  
  24.  Base b = d;//直接賦值(產生切割)  
  25.  b.Test();  
  26.   
  27.  Base& b2 = d;//使用引用賦值(不產生切割)  
  28.  b2.Test();  
  29.   
  30.   Base* b3 = &d;//使用指針賦值(不產生切割)  
  31.   b3->Test();  
  32.   return 1;  
  33. }  


 

因此,我們得出結論,在向上強制轉換過程中,使用指針和引用不會造成切割,而使用直接賦值會造成切割。

 

向下強制類型轉換

使用dynamic_cast進行向下強制類型轉換。使用此關鍵字有一下幾個條件

1.必須有虛函數

2.必須打開編譯器的RTTI開關(vc6: progect-> settings -> c/c++ tab ->category[c++ language]-> Enable RTTI)

3.必須有繼承關係

  1. Base *b = new Derived;  
  2.  Derived *d = dynamic_cast<Derived*>(b);  
  3.  if(!d)  
  4.  {  
  5.   cout << "dynamic cast err!"<<endl;  
  6.  }  
  7.  else  
  8.  {  
  9.   d->Test();  
  10.  }  


 

 本例子中,符合以上條件,轉換成功。否則,會拋出std::bad_cast異常,轉換返回NULL

因此,我們可以使用dynamic_cast來判斷兩個類是否存在繼承關係 

發佈了11 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章