純虛函式與抽象類

2021-08-05 22:05:19 字數 1335 閱讀 8497

一.純虛函式

virtual … = 0;

•形如 

class 類名

; 的虛函式,稱為純虛函式或抽象方法

–class shape

;

•純虛函式可以不定義,但如果定義,必須寫在類的外部

–void shape::draw (void) const

•在基類的構造和析構函式中呼叫純虛函式,結果將是未定義的。

通常會在鏈結階段報告失敗。如果該純虛函式有定義,編譯器將在給出警告之後,選擇呼叫基類版本

一.純虛函式與抽象類

•至少包含乙個純虛函式的類稱為抽象類

–class abstract 

virtual void bar (void)

virtual void hum (void) = 0;

};

•純虛函式因其所代表的抽象行為而無需或無法實現,包含此種函式的類亦因其所具有的一般性而表現出抽象的特徵

•抽象類往往用來表示在對問題進行分析、設計的過程中所得出的抽象概念,是對一系列看上去不同,但本質上相同的具體概念的抽象

二.抽象類不能例項化為物件

•無論是直接定義,還是通過new運算子,抽象類永遠不能例項化為物件

–shape shape (…); // 錯誤

–shape* shape = new shape (…); // 錯誤

–void show (shape shape); // 錯誤

–shape make (void); // 錯誤

三.抽象類的子類

•抽象類的子類如果不對基類中的全部純虛函式提供有效的覆蓋,那麼該子類就也是抽象類

–class a 

;–class b : public a

void bar (int x, int y) // 沒有覆蓋a::bar,繼承之

};–class c : public b

// 覆蓋b中從a繼承的bar

};

一.面向抽象

•全部由純虛函式構成的抽象類稱為純抽象類或介面

•面向抽象程式設計,使得所有基於介面編寫的**,在子類被更替後,無需做任何修改或只需做很少的修改,就能在新子類上正確執行

–class animal 

;–animal* animal = new cat (...); // dog, ox, sheep, ...

animal->eat ();

animal->run ();

animal->cry ();

純虛函式與抽象類

有時我們僅僅想讓基類表示一種抽象的概念,而不與具體的事物相聯絡 如 我在基類中定義乙個多邊形的函式shape 但是我並不想讓它指向某乙個具體的多邊形 三角形呀,四邊形呀 我只想讓它指明多邊形都共有的特徵 都有兩條以上的邊構成,都有角。然後在它的派生類中在對對變形進行具體化 這時便用到了純虛函式 純虛...

純虛函式與抽象類

一 純虛函式 在基類中宣告的虛函式在各派生類中根據實際需要給出各自定義。syntax virtual returntype functionname 參數列 0 宣告為純虛函式後,基類中就可以不再給出函式的實現部分,函式體由派生類給出。在基類中對純虛函式定義的函式體的呼叫,必須通過 基類名 函式名 ...

純虛函式與抽象類

1 純虛函式是乙個在基類中說明的虛函式,在基類中沒有定義,要求任何派生類都定義自己的版本 2 純虛函式為各派生類提供乙個公共介面 介面的封裝設計 3 純虛函式說明形式 virtual 型別 函式名 參數列 0 4 乙個具有純虛函式的基類稱為抽象類。定義乙個抽象類,含有純虛函式類叫做抽象類。1 如果子...