Download presentation
Presentation is loading. Please wait.
1
Object-Oriented Programming
2
物件導向編程OOP 奠基於三種基礎概念 --資料抽象化(data abstraction) 使用classes
--繼承(inheritance) 運用類別衍生(class derivation)讓一個class繼承至另一個 --動態綁定(dynamic binding) 讓編譯器於執行時決定使用base class或derived class定義 的函式
3
繼承(inheritance) Base class 的成員會被 derived classes 繼承 可以直接使用成員函式也可重新定義函式
需要被重新定義的函式必須是virtual derived classes 可定義額外成員 Base class : Item_base (無折扣) book() : 返回isbn net_price(): 返回購買某特定冊數後的價格 (需設為virtual) Derived class : Bulk_item (折扣)
4
動態綁定(dynamic binding)
讓程式可以使用繼承體系內任一型物件,無須擔心那些物件的確切型別
5
定義base class 定義方式和一般class大致相同
6
定義base class Derived class對base class的public和private成員的存取權和 其他部分對他們的
存取控制與繼承 Derived class對base class的public和private成員的存取權和 其他部分對他們的 存取權相同,如base class的某成員想讓Derived class可存取而禁止一般用戶存 取就要設為protect Derived物件只能透過(自身或另一個)derived物件存取base class 的protected成員 public private protect 一般用戶 v x Derived class
7
Derived Class(衍生類別) 定義 EX access-label public , protected , private
base-class 可指定多個base class EX Class classname : access-label base-class
8
Derived Class(衍生類別) Derived Class 和 virtual 函式
-- Derived type 必須為想重新定義的函式引入宣告式 -- Derived Class 內的virtual函式宣告必須和base內的一樣 (例外: virtual 函式返回reference(pointer)指向base class時,可返回以 public方式繼承至base class的 class ) Derived物件內含其base class成為子物件
9
Derived Class(衍生類別) 「 class 不能衍生自其本身」 Class 必須先定義好才能成為base class
可以將derived class當成base class使用 Dervied class 宣告式
10
Derived 轉換為Base 因為derived物件均含有base成分,所以可以進行以下操作
將base-type reference 或pointer綁定於derived物件上,對物件本身並無影響,物件本身仍為derived物件
11
Public,Private,Protected繼承
Derived物件中繼承而得的成員之存取權由「base class對該成員的存取級別」和「derived class 以何種方式繼承」共同控制 Class classname : access-label base-class public private protected Public 繼承 Private繼承 Protected繼承
12
Public,Private,Protected繼承
access-label控制的只是「derivation的使用者」對「繼承自base的成員的存取權」,無論access-label為何,所有繼承自base的class對於base的成員均有相同存取權 豁免個別成員:因為使用private或protected繼承,成員存取能會更受限制,所以我們可以藉由using恢復存取權
13
Friend 和繼承 Friend可以存取class的private和protected的資料 Friend的關係並不會被繼承
14
轉換和繼承 Derived 轉換至 base 以Derived 物件對base物件作初始化或賦值
--轉換至reference : 物件沒有改變 --轉換至odject : 參數型別會改變,derived物件的base部 分會被複製到參數上 以Derived 物件對base物件作初始化或賦值
15
轉換和繼承 Base轉換至Derived --- 無自發轉換關係
-- 即使base的reference或pointer實際綁定於derived物件, 轉換限制依然存在
16
建構式和拷貝控制項 建構式和拷貝控制項成員不會被繼承,每個class應該定義自己的建構式和拷貝控制項
Base-class 建構式和拷貝控制項 -- 自身不是衍生類別的base class,其建構 式和拷貝控制項不受 影響,看起來一樣。
17
Derived class的建構式 因繼承自另一個class,因此建構式除了初始化自身成員變數,還得初始化其base class
合成的derived class default建構式 : -- base成分由base class的default建構式初始化 a. 喚起Base_item的default建構式 b. 完成Bulk_item成員的初始化
18
Derived class的建構式 由於Bulk_item有內建型成員,因此需要定義一個default建構式
傳遞引數給base class建構式 : 除default建構式,還允許用戶初始化成員。因derived class建構式的initialize list只能初始化derived class成員,所以需藉由在建構式initialize list含入base class,才能間接初始化繼承而來的成員
19
Derived class的建構式 只有直接繼承的base class可被初始化
Similar presentations