Presentation is loading. Please wait.

Presentation is loading. Please wait.

物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3

Similar presentations


Presentation on theme: "物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3"— Presentation transcript:

1 物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3
物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3. 施威銘研究室著,最新 Java 2 程式語言 第 2 版,旗標出版社。 1.由 C++ 進入 Java 程式語言(I): C++ 之類別繼承 Chih-Hung Wang

2 基底類別與衍生類別 (1/2) 以既有類別為基礎,進而衍生出另一類別,稱為 「類別的繼承」(inheritance of classes)
原有的類別稱為「父類別」(super class)或「基 底類別」(basis class) 因繼承而產生的新類別則稱為「子類別(sub class) 或「衍生類別」(derived class)

3 基底類別與衍生類別 (2/2) 類別成員繼承的關係

4 簡單的繼承範例 (1/6) 類別繼承的格式

5 簡單的繼承範例 (2/6) 下面的範例簡單說明繼承的使用方法

6 簡單的繼承範例 (3/6) 下圖是本例中,父類別與子類別所佔記憶體之比較

7 簡單的繼承範例 (4/6)

8 簡單的繼承範例 (5/6) 本例的繼承關係圖繪製如下

9 簡單的繼承範例 (6/6) 由前一個範例可學到下列幾點重要的觀念 透過類別的繼承,可將父類別的成員繼承給子類別
在執行子類別的建構元之前,會先自動呼叫父類別中沒有引 數的建構元 子類別物件所佔的位元組,等於自己資料成員所佔的位元組, 加上繼承過來之成員所佔用的位元組

10 呼叫父類別中特定的建構元 (1/4) 下面是呼叫父類別CWin裡特定建構元的範例

11 呼叫父類別中特定的建構元 (2/4)

12 呼叫父類別中特定的建構元 (3/4)

13 呼叫父類別中特定的建構元 (4/4) 這裡有很重要的兩點要提醒讀者: 如果省略34行的敘述,則父類別中沒有引數的建構元還是會 被呼叫。
呼叫父類別中特定的建構元,其敘述必須寫在子類別建構元 第一行的後面,並以「:」連接,不能置於它處

14 Practice 1 請試著完成下列程式設計 設計一個父類別 Caaa,內涵兩個 public 整數成員 num1 及 num2
設計一個子類別 Cbbb,繼承至 Caaa,並加入 set_num() 函數,用來設定從父類別繼承而來的成員 num1 及 num2。 再設計一個 show() 函數,用來顯示 num1 及 num2 的值。 在主程式 main() 裡宣告 Cbbb 類別的變數 obj,利用 set_num() 函數將 num1 的值設為 10,num2 的值設為 20, 在以 show() 印出成員的值。

15 使用建構元常見的錯誤 (1/3) 下面是呼叫父類別建構元時常犯的錯誤範例

16 使用建構元常見的錯誤 (2/3)

17 使用建構元常見的錯誤 (3/3) 下面的程式是修正 prog16_3的錯誤

18 父類別裡私有成員的存取 (1/4) 錯誤的例子--存取到父類別裡的私有成員

19 父類別裡私有成員的存取 (2/4)

20 父類別裡私有成員的存取 (3/4) 修正prog16_5的錯誤

21 父類別裡私有成員的存取 (4/4)

22 使用protected成員 (1/2) 把成員宣告成protected最大的好處是兼顧到成員的安 全性與便利性(繼承子類別可直接取用)
下面的範例是prog16_5的小改版

23 使用protected成員 (2/2)

24 類別繼承的存取模式 下圖說明類別繼承的存取模式

25 Practice 2 參考課本 16-33 習題 11

26 Practice 3 (1) 汽車繼承練習 一個汽車的基本類別如下 class car { protected:
int num_doors; public: car(); car(int d): num_doors(d) {} }; 其中 car() 為預設汽車為 4 門房車,car(int d) 可填入房車門數

27 Practice 3 (2) 兩個繼承的類別 Mercedes 為 4 門房車,增加一個 private data 為汽車價格,增加 一個 public function 為輸出汽車相關資料(車門數、價格) TIIDA 為 4 或5 門房車,需要透過car(int d): num_doors(d) {} 來設 定。增加一個 private data 為汽車價格,增加一個 public function 為輸出汽車相關資料(車門數、價格) 主程式有兩個物件,分別為 Mercedes 及 TIIDA 車種,其中 TIIDA 車物件需要輸入門數。呼叫相關函數以輸出汽車之 資料。

28 多載與改寫 「多載」是函數名稱相同,在不同的場合可做不同的事
「改寫」是在子類別裡定義與父類別名稱相同的函數, 用來覆蓋父類別裡函數功能的一種技術

29 改寫的範例 (1/2) 簡單的改寫範例

30 改寫的範例 (2/2)

31 「改寫」與「多載」的比較 「多載」:英文名稱為overloading 「改寫」:英文名稱為overriding
它是在相同類別內,定義名稱相同,但引數個數或型態不同 的函數,C++可依據引數的個數或型態,呼叫相對應的函數 「改寫」:英文名稱為overriding 它是在子類別當中,定義名稱、引數個數與型態均與父類別 相同的函數,用以改寫父類別裡函數的功用

32 Practice 4 參考 Practice 1 試在父類別 Caaa 加入一個 display() 函數,可以顯示 “Printed from Caaa class” 在子類別加入 display() 函數,用來改寫父類別之函數,顯 示 “Printed from Cbbb class” 在主程式 main() 中宣告 Caaa 物件 obj1,Cbbb 物件 obj2, 利用這兩個物件呼叫 display() 函數。

33 錯誤的使用拷貝建構元 (1/6) 如果父類別或子類別裡沒有提供拷貝建構元的話,編 譯器會提供一個預設的拷貝建構元
下面是一個因沒有撰寫拷貝建構元而發生錯誤的例子

34 錯誤的使用拷貝建構元 (2/6)

35 錯誤的使用拷貝建構元 (3/6)

36 錯誤的使用拷貝建構元 (4/6)

37 錯誤的使用拷貝建構元 (5/6) 下圖為執行完60行後的結果 下圖為執行完61行後的結果

38 錯誤的使用拷貝建構元 (6/6) 要解上面的錯誤,只要在子類別內加上一個拷貝建構元

39 修正錯誤 (1/5) 下面的程式是修正沒有 撰寫拷貝建構元的錯誤

40 修正錯誤 (2/5)

41 修正錯誤 (3/5)

42 修正錯誤 (4/5)

43 修正錯誤 (5/5) 下圖為執行47與53行後之結果

44 建構元與解構元的呼叫時機 建立物件時,父類別的建構元會先被執行,然後再執 行子類別的建構元
銷毀物件時,子類別的解構元會先被執行,然後再執 行父類別的解構元


Download ppt "物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3"

Similar presentations


Ads by Google