程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 如何更好的學習C++

如何更好的學習C++

編輯:C++入門知識

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

  1. class Base{public:int b;virtual void Test(){cout
  2.  << "base" <<endl;}};class Derived:public Base{public:int d;virtual void Test(){cout 
  3. << "derived" <<endl;}};int main(){Derived d;Base b = d;
  4. //直接賦值產生切割)b.Test();Base& b2 = d;//使用引用賦值不產生切割)b2.Test();Base* b3 = &d;
  5. //使用指針賦值不產生切割)b3->Test();return 1;} 


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

  1. class Base{public:int b;virtual void Test(){cout
  2.  << "base" <<endl;}};class Derived:public Base{public:int d;virtual void Test(){cout 
  3. << "derived" <<endl;}};int main(){Derived d;Base b = d;
  4. //直接賦值產生切割)b.Test();Base& b2 = d;//使用引用賦值不產生切割)b2.Test();Base* b3 = &d;
  5. //使用指針賦值不產生切割)b3->Test();return 1;} 


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

1、必須有虛函數;
2、必須打開編譯器的RTTI開關(vc6: progect-> settings -> c/c++ tab ->category[c++ language]-> Enable RTTI);
3.必須有繼承關系。

  1. class Base{public:int b;virtual void Test(){cout
  2.  << "base" <<endl;}};class Derived:public Base{public:int d;virtual void Test(){cout 
  3. << "derived" <<endl;}};int main(){Derived d;Base b = d;
  4. //直接賦值產生切割)b.Test();Base& b2 = d;//使用引用賦值不產生切割)b2.Test();Base* b3 = &d;
  5. //使用指針賦值不產生切割)b3->Test();return 1;} 

本例子中,符合以上條件,轉換成功。否則,會拋出std::bad_cast異常,轉換返回NULL。因此,我們可以使用dynamic_cast來判斷兩個類是否存在繼承關系。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved