C 抽象類小覽

2021-09-23 23:23:27 字數 3371 閱讀 7472

virtual 方法和 virtual 類可以說是c++語言的一大特性,甚至有人說是c++語言的精髓,其實這麼說也是有一定道理的,因為執行時多型在c++中體現淋漓盡致,而 virtual 就是為多型服務的。這也是乙個一定要搞懂的c++問題,所以有了這篇文章。同時,我覺得這類底層問題不可能一文以蔽之,而且我也相信真正想搞懂這個問題的讀者,不會唯讀我這一篇文章,所以只是小覽,同時歡迎討論和指正。

其實,引入純虛函式的原因我在我另一篇文章虛函式與多型小覽就有寫,不過重要的話說三遍,還只是兩遍呢,哈哈~~知其然也需要知其所以然

純虛函式:純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」。

抽象類:含有乙個或以上純虛函式的類,叫做抽象類,有的地方還有叫純虛類。我的理解是關於定義,還是選擇乙個一定正確的說法,也就是選擇抽象類來叫更好。

還有另外乙個概念叫「虛基類」,但是這是c++多重繼承的概念,之後再討論。

如: virtual void funtion()=0

1、為了方便使用多型特性,我們常常需要在基類中定義虛函式。

2、在很多情況下,基類本身生成物件是不合情理的。

例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

這樣就清楚有抽象類的原因了吧~~

羅列的不一定有順序,但是盡量羅列到,歡迎補充

1、首先說明:抽象類是區別於虛類的。虛類可以例項化,但是抽象類不能被例項化,也就永遠沒有物件。。。。。。t.t(永遠沒有物件,好慘!!)

2、如果子類沒有實現純虛函式,相當子類也有純虛函式,所以子類也是抽象類。

3、其他類的定義與使用方式都與一般類差不多,大致有如下地方:

1)抽象類可以有成員變數 (可以)

2)抽象類可以有普通的成員函式 (可以)

3)抽象類可以有其他虛函式 (可以)

4)抽象類可不可以有帶有引數的建構函式?(可以)

5)可不可以在抽象類的派生類的建構函式中顯式呼叫抽象類的帶引數建構函式 (可以)

1、抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承層次結構的較上層(而不是絕對的上層,也有可能是中層,甚至底層)。

2、在實際中為了強調乙個類是抽象類,可將該類的建構函式(設定為protected) 說明為保護的訪問控制許可權。

3、抽象類的主要作用是將有關的組織在乙個繼承層次結構中,由它來為它們提供乙個公共的根 (其實不一定是根),相關的子類是從這個根派生出來的。

4、抽象類刻畫了一組子類的操作介面的通用語義,這些語義也傳給子類。一般而言,抽象類只描述這組子類共同的操作介面,而完整的實現留給子類。

5、抽象類只能作為基類來使用(大多數情況是其他類的基類,但是抽象類本身也有可能是子類)。

6、可以定義指向抽象類的指標和引用,此指標可以指向它的派生類,進而實現多型性。

作為介面使用的例子:

#include

#include

#include

#include

using

namespace

std;

class animal

virtual

void eat(const

string name) =0;

};class dog:public animal

;void dog::eat(const

string name)

}int main(void)

另乙個好例子,多型的例項:

#include

using namespace std;

const

double pi=3.14159;

class shapes //抽象類

virtual

void disp()=0;//純虛函式

};class square:public shapes

有這麼個問題:

我們知道c++中有虛函式的類會有乙個對應的虛函式表,那麼抽象類有虛表嗎,如果有的話怎麼呼叫純虛函式?

直覺上來講,應該是有的。可是既然是抽象類,說明其物件永遠不會被建立,那麼維護個虛表貌似也不是很必要了。

設計個程式來驗證一下:

class virtualbase

void non_virtual_fun()

virtual

void virtual_fun() = 0;

};class derived: public virtualbase

};int main(int argc, const

char* ar**)

分析:

(1)sizeof(virtualbase)返回4,而不是代表空類的1,這說明其內部是有乙個虛表指標,而有虛表指標,那麼極有可能有乙個虛表。

(2)通過上面的程式,我們在例項化derived時可以調入virtualbase的建構函式,此時可以在watch視窗中檢視this指標,的確有乙個虛表指標指向乙個虛表。

在建構函式中通過乙個非虛函式呼叫乙個純虛函式 - 雖然該純虛函式在derived中被實現,但此時還在基類的建構函式中,所以,純虛函式被呼叫 - 出錯

抽象類需要虛表,我能想到的乙個原因是在多個派生類中override時,我們需要保證被改寫的函式是在正確的偏移位址的,為了保證這個位址是正確的,事先準備乙個模板還是比較重要的。

—end—

參考文獻

[1]

[2]

[3]

C 抽象類總結

c 抽象類總結 1 解釋什麼是抽象類?抽象類是包含抽象方法的類。那麼什麼又是抽象方法呢?抽象方法是沒有方法內容的,只有乙個方法名和引數列表的方法。並以 結尾。為了標註他的與眾不同,在他的返回型別前加abstract 並在class 前加abstract 簡言之,由abstract 修飾的方法和類就是...

C 基礎 抽象類

下面,我們舉乙個完整的例子 例11 22 include class cpolygon virtual int area void 0 class crectangle public cpolygon class c public cpolygon int main 本程式計算本輸出矩形和三角形的面...

C 介面(抽象類)

介面描述了類的行為和功能,而不需要完成類的特定實現。c 介面是使用抽象類來實現的,抽象類與資料抽象互不混淆,資料抽象是乙個把實現細節與相關的資料分離開的概念。如果類中至少有乙個函式被宣告為純虛函式,則這個類就是抽象類。純虛函式是通過在宣告中使用 0 來指定的,如下所示 class box 設計抽象類...