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

2021-07-02 15:07:07 字數 2199 閱讀 4855

5.2漫遊:物件導向程式設計思維

程式編寫:

接下來,讓我們實現乙個三層的類體系,並藉此引入c++語言中基本組成和支援物件導向程式設計方法的語法元素。我以libmat這個抽象基類作為類體系中最根本的類。我從libmat派生出book,並從book中派生出audiobook.

我們先限定介面只有乙個constructor乙個destructor和乙個print()函式,我為每個member function加上一寫程式**,輸出資訊表示它們的存在,讓我們得以跟蹤程式的行為。

預設情形下,member fuction的解析(resolution)皆在編譯時靜態進行。若要另其在執行時動態進行,我們就得在它的宣告前加上關鍵字virtual。libmat的宣告表示,其

destructor和print()皆為virtual(虛函式)

class libmat

virtual ~libmat()

virtual void print() const

}; 

現在我們定義乙個non-member fuction print(),它接受乙個引數,其形式為 const libmat reference:

void print(const libmat &mat)

virtual ~book()

virtual void print()const;

book中的print()覆蓋了(override)libmat的print().這也正是mat.print()所呼叫的函式。title()和auther()是兩個所謂的訪問函式,都是non-virtual inline函式。過去我們不曾介紹關鍵字protected是的,被宣告為protected所有成員函式都可以被派生類直接訪問,除此(派生類)以外,都不得直接訪問protected成員。

接下來,我從book類派生出乙個更特殊的audiobook類。audiobook除了擁有標題和作者,還有播講者。在檢視其實現之前,先讓我把audiobook物件傳給print():

cout<<"\n"<<"creating an audiobook object to print()\n";

audiobook ab("man without qualities","robert musil","kenneth meyer");

print(ab);

我們應該預期出現什麼樣的跟蹤結果呢?我們應該預期:(1)通過mat.print()呼叫的是audiobook::print()(2)ab的構造過程乃是依次呼叫libmat,book,audiobook的constructor。一下即是跟蹤結果:

creating a book object to print()

libmat::libmat() default constructor!

book::book(the castle,franz,kafka)constructor

//處理print(b)

in global print():about to print mat.print()

book::print()--i am a book object!

my title is:the castle

my auther is:franz kafka

//析構book b

book::~book() destructor!

libmat::~libmat()destructor!

該如何實現audiobook這個派生類呢?我們只需要把焦點放在audiobook與其基類book的不同之處——也就是print()——即可。當然,我們還必須提供audiobook播講者姓名,以及這個類的constructor和destructor。至於book類所提供的各項資料及操作函式,均可被audiobook直接使用,彷彿它們本來便是由audiobook定義似的。

class audiobook:public book

virtual void print() const

protected

string _narrator;

使用派生類時不必刻意區分「繼承而來的成員」和「自身定義的成員」。兩者的使用完全透明:

int main()

audiobook ab("mason and dixon","thomas pynchon","edwin leonard");

cout<<"the title is"<<<"the author is:"<<<"the narrator is:"<

第五章 物件導向程式設計

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

第五章 面向方面程式設計

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

第五章 面向方面程式設計

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