純虛函數 純虛函數是指沒有函數體,定義時在函數名后加上=0,如下代碼所示
class Shape{public: virtual double calcArea()//虛函數 {return 0;} virtual double calcPerimeter()=0;//純虛函數PRotected: int m_iEge;};在虛函數指針指向的虛函數表中,calcPerimeter=0。含有純虛函數的類叫做抽象類,抽象類無法實例化對象(無論堆中或棧中),當抽象類的子類,將基類中的純虛函數都進行賦值以后,即不是=0后才能夠實例化。
接口類 僅含有純虛函數的類叫做接口類,接口類沒有數據成員,僅有純虛成員函數。如下代碼所示
class Shape{public: virtual double calcArea()=0; virtual double calcPerimeter()=0;};運行時類型識別(RTTI Run-Time Type Identification)。 在下面的代碼中,能不能做到判斷對象類型完成注釋的部分,就要用到RTTI
class Flyable{public: virtual void takeoff() = 0; virtual void land()=0;};class Bird : public Flyable{public: void foraging(){......} virtual void takeoff(){......} virtual void land(){......}private: ...};class Plane : public Flyable{public: void carry(){......} virtual void takeoff(){......} virtual void land(){......}};void doSomething(Flyable *obj){ obj->takeoff(); //如果是bird,則覓食 //如果是plane,則運輸 obj->land();}所使用的的代碼如下所示
void doSomething(Flyable *obj){ obj->takeoff(); cout << typeid(*obj).name()<< endl;//輸出當前指針指向的類型名 if (typeid(*obj) == typeid(Bird))//對類型進行比對 { Bird *bird = dynamic_cast<Bird *>(obj);//進行類型的轉化 bird->foraging(); } obj->land();}同樣我們在使用dynamic_cast的時候有以下幾點注意事項 1.只能用于指針和引用的轉換 2.要轉換的類型中必須含有虛函數 3.轉換成功,返回的是子類的地址,失敗則是NULL
同樣在使用Typeid時也有以下幾點注意事項 1.type_id返回的是一個Type_info對象的引用 2.如果想通過基類的指針獲得派生類的數據類型,基類必須帶有虛函數 3.只能獲取對象的實際類型
#include <typeinfo>//需要該頭文件int main(){ Flyable *p = new Bird(); cout << typeid(p).name() << endl; //打印出Flyable * cout << typeid(*p).name() << endl;//打印出Bird return 0;}異常處理 異常是指程序在運行過程中出現的錯誤,這些錯誤并不是我們所希望的,但是往往在某種情況下這種錯誤會出現。 異常處理就是對可能發生異常的地方做出預見性的安排,如果我們做出的安排合理,并且能夠給出人性化的提示,那么使用者就不會覺得突兀
進行異常處理用到兩個關鍵字 1. try….catch…. 嘗試(運行正常的邏輯)……捕獲……. [Try catch是一對多的關系] 2. throw 拋出異常
基本思想:主邏輯與異常處理分離
常見的異常: 1.數組下標越界 2.除數為0 3.內存不足
新聞熱點
疑難解答
圖片精選