搞懂C++抽象類

​作者:良知猶存

轉載授權以及圍觀:歡迎添加微信:Allen-Iverson-me-LYN

    抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。

    通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱爲抽象類,它不能生成對象;在java中,含有抽象方法的類稱爲抽象類,同樣不能生成對象。

    抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏和充當全局變量的角色。

 

一、抽象類出現的標誌

   之我們講到虛擬繼承的使用,在那篇文章中介紹了虛擬函數,用virtual標記的函數,C++的虛擬繼承(基礎)沒有看到的朋友,可以看這篇文章瞭解一下。

    一個虛函數等於0,則此虛函數爲純虛函數。如果一個類有純虛函數則這樣的類就是抽象類。

 

示例如下:

class Human {private:       inta;   int type;public:       virtualvoid eating(void) =0;/*純虛函數*/   virtual void wearing(void)=0;   virtual void drving(void)=0;   virtual~Human() { cout<<"~Human()"<<endl; }   virtual Human* test(void) {       cout<<"Englishman test()"<<endl;       return this;       }};

 

二、引入原因

     更加方便的解決多態的問題(多重繼承或者一個基類被多次繼承)。解決派生的基類實體化問題,例如:我們定義一個基類是人類,通過繼承基類,我們派生出英國人,中國人,美國人,如果人類這個基類是普通類,則它也會生成實體化對象,一個組成物體的元素也生成對象,這個是不被接受的。所以我們定義基類爲抽象類(含有純虛函數的類),而抽象類不能被申明爲一個實體變量。

     抽象類可以作爲一個接口,通過作爲一個繼承中的最底層類存在,定義程序框架。

 

抽象類不可以被申明爲一個實體變量

int main(uint argc,char ** argv){    Human h;}

 

  

三、使用規則

    如果派生類中沒有對純虛函數進行定義,則派生類也會成爲一個抽象類,也不可以被申明爲實體變量,需要再次派生一個子類,直至將基類的純虛函數定義。派生類定義純虛函數的時候可以寫virtual 也可以不寫。

    非類的成員函數不能定義爲虛函數,類的成員函數中靜態成員函數和構造函數也不能定義爲虛函數,但可以將析構函數定義爲虛函數

 

四、使用純虛函數優勢

  1. 減少代碼量

  2. 在繼承基類的時候,編譯器阻止程序生成實例化對象

 

五、進一步學習

    多人編寫程序的時候,一共分爲兩種,一種是應用編程,根據提供的類進行使用;一種是提供類,進行類編程。

 但是編寫代碼過程中由於頭文件的包含,類文件修改導致應用程序部分需要重新編譯,所以需要一個相對固定的包含的頭文件包含相應函數(抽象類界面或者叫接口)進行編譯.

 

    利用動態庫的應用,我們就可以對程序的底層的類進行修改而不會影響到main中應用使用邏輯造成影響。我的.so文件關聯到類的實現,編譯隨着類的修改而變化,而main.cpp不受類文件的修改而影響。

 

 

 

使用動態鏈接庫,需要設置LD_LIBRARY_PATH (linux 環境變量名)

 

設置路徑到當前目錄,發現成功運行,

 

修改類文件再進行編譯:

  

 下一篇文章再着重分析一下抽象類與接口(類)。

 

更多分享,掃碼關注我

微信:Allen-Iverson-me-LYN

 

 

 

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