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 引入封裝,繼承,多型性等概念來建立一種物件層次結構,這種物件層次結構通俗的...