純虛函式和抽象基類

2021-06-29 04:25:54 字數 1122 閱讀 2845

純虛函式的格式:

virtual 《型別》

《函式名》 (參數列) =0;

而我們的純虛函式經常被用來構建抽象基類。

抽象基類:當我們僅想對基類進行向上型別轉換,使用它的介面,而不希望使用者實際地建立乙個基類的物件,那麼我們就在基類中加入至少乙個純虛函式(pure virtual function),來使基類稱為抽象(abstract)類。

當繼承乙個抽象類時,必須實現所有的純虛函式,否則繼承出的類也將是乙個抽象類。

例項:

//pure abstract base classes

#include

using namespace std;

//enum note ;

class instrument

;//rest of the file is the same...

class wind: public instrument

void adjust(int)

void adjust(int){}

};class brass: public wind

};//identical function from before:

void tune(instrument& i)

//new function:

void f(instrument& i)

int main()

以上**中,instrument的目的是對所有從它派生出來的類建立公共介面。

既然是介面,那麼我們實際上並不需要例項化instrument物件,那麼寫成純虛函式的目的也是讓編譯器禁止例項化。

純虛函式告訴編譯器在vtable中為函式保留乙個位置,但在這個特定位置中不放位址,那麼vtable就是不完全的,所以編譯器就在例項化時發出乙個出錯資訊。

這裡需要注意,純虛函式禁止對抽象類的函式以傳值方式呼叫。這是防止物件切片(object slicing)的一種方法。通過抽象類,可以保證在向上型別轉換器件總是使用指標或引用。

以上**的執行結果:

wind::play

stringed::play

brass::play

wind.adjust()

純虛函式和抽象基類

純虛函式就是基類只定義了函式體,沒有具體的實現過程,必須在子類中加以實現。如果基類中含有乙個或多個純虛函式,那麼它就屬於抽象基類,不能被例項化。1 引入抽象基類和純虛函式的原因有以下兩點 1 為了方便的是使用多型特性 2 在很多情況下,基類本身生成物件是不合情理的。抽象基類不能夠被例項化,它定義的純...

虛基類 虛函式 純虛函式和抽象類

一 虛基類 在 多繼承 中講過的例子中,由類a,類b1和類b2以及類c組成了類繼承的層次結構。在該結構中,類c的物件將包含兩個類a的子物件。由於類a是派生類c兩條繼承路徑上的乙個公共基類,那麼這個公共基類將在派生類的物件中產生多個基類子物件。如果要想使這個公共基類在派生類中只產生乙個基類子物件,則必...

C 抽象基類和純虛函式

為什麼c 要定義抽象基類?c 為什麼要定義抽象基類?抽象類就是類裡定義了純虛成員函式的類。純虛函式只提供了介面,並沒有具體實現。抽象類不能被例項化,通常是作為基類供子類繼承,子類中重寫虛函式,實現具體的介面。為什麼要定義抽象基類呢?依我所見主要有以下原因 1.最重要的原因是,可以將介面與實現分離。介...