第五章 物件導向的程式設計風格(定義乙個抽象基類)

2021-07-02 18:55:24 字數 2180 閱讀 2901

5.4定義乙個抽象基類

本節將重新定義前一節的num_sequence class.我要為所有數列設計出共享的抽象基類,然後繼承它。

這該如何做到呢?  定義抽象基類的第乙個步驟就是找出所有子類共通的操作行為。

舉個列子,所有數列類的共通操作行為是什麼呢?這些操作行為代表的是num_sequence這個基類的公有介面(public inte***ce)。

以下是我的第一次嘗試:

class num_sequesce;

virtual int elem(int pos)const=0;

virtual const char* what_am_i()const=0;

static int max_elems()

virtual ostream& print(ostream &os=cout)const=0;

protected:

virtual void gen_elems(int pos)const=0;

bool check_integrity(int pos)const=0;

const static int _max_elems=1024;

};//對資料成員分類的一般規律:1、public\private\protected 2、對virtual進行分類 3、構造繼承函式。

每個虛函式,要麼得有其定義,要麼可設為純虛函式——如果對於該類而言,這個虛函式並無實際意義的話。

例如:gen_elems()之於num_sequence class.將虛函式賦值為0,意思是另它成為乙個純虛函式:

virtual void gen_elems(int pos)=0;

任何類宣告如果有乙個或多個純虛函式,那麼,由於其介面的不完整性(純虛函式沒有函式的定義,是謂不完整),程式無法為它產生任何物件。這種類只能作為派生類的子物件(subject)使用,而且前提是這些派生類必須為所有的虛函式提供確切的定義num_sequence class應該宣告什麼樣的data member呢?這個問題並不存在任何必須堅持或者快速判斷的標準。本例中,num_sequence並未宣告任何data member,因為它只是為數列繼承體系提供的乙個介面;派生類必須自行設計自身的data member.

那麼constructor和destructor又當如何?由於此類並沒有任何non_static data member需要進行初始化操作,所以其constructor亦無存在價值。不過,我會為它設計destructor。是的,根據一般規則,凡基類定義有乙個或多個虛函式,應該將其destructor宣告為virtual.像這樣:

class num_sequence

為什麼呢?考慮已下程式片段:

num_sequence *ps=new fibonacci(12);

//....使用數列

delete ps;

ps是基類num_sequence的指標,但它實際是指向派生類fbonacci物件。當delete表示式被應用於該指標,destructor會先應用於指標所指的物件上,於是將此物件占用的記憶體空間歸還給程式的空閒(free store)。還記得嗎?non_virtual函式在編譯時便已經完成了解析(resolved)根據該物件被呼叫的型別來判斷。

於是,本例中,通過ps呼叫的destructor一定是fibonacci的destructor.正確的情況應該是根據實際物件的型別選擇呼叫哪乙個destructor。而解析操作應該在執行時進行。為了促進正確的行為的發生,我們必須將destructor宣告為virtual。

但是我並不建議在我們這個基類將其destructor宣告為pure virtual——雖然它其實不具有任何實質意義的實現內容。對這類destructor而言,最好是提供空白定義,像下面這樣2:

inline num_sequence::~num_sequence(){}

為求完整,下面列出num_sequence的output運算子和check_integrity()函式的實現:

bool num_sequence::

check_integrity(int pos)const

return true;

}ostream& operator<<(ostream &os,const num_sequence &ns)

雖然上述內容使我們完成了抽象基類num_sequence的整個定義,但是類本身並不完全,它僅僅是為其派生類提供了乙個介面而已。每個派生類還必須提供適合的實現細節,以補足基類num_sequence的不足。

第五章 物件導向的程式設計風格(物件導向的程式設計思維)

5.2漫遊 物件導向程式設計思維 程式編寫 接下來,讓我們實現乙個三層的類體系,並藉此引入c 語言中基本組成和支援物件導向程式設計方法的語法元素。我以libmat這個抽象基類作為類體系中最根本的類。我從libmat派生出book,並從book中派生出audiobook.我們先限定介面只有乙個cons...

第五章 物件導向程式設計

一.單選題 共6題,100.0分 1以下關於c 中方法過載的說法正確的是 a 如果兩個方法名稱不同,而引數的個數不同,那麼它們可以構成方法過載 b 如果兩個方法名稱相同,而返回值的資料型別不同,那麼它們可以構成方法過載 c 如果兩個方法名稱相同,而引數的資料型別不同,那麼它們可以構成方法過載 d 如...

第五章 面向方面程式設計

面向方面程式設計,又稱面向切面程式設計 aspect oriented programming 英文縮寫 aop,可以說是 oop object oriented programming 物件導向程式設計的補充和完善。oop 引入封裝,繼承,多型性等概念來建立一種物件層次結構,這種物件層次結構通俗的...