• 沒有找到結果。

繼承

N/A
N/A
Protected

Academic year: 2021

Share "繼承"

Copied!
27
0
0

加載中.... (立即查看全文)

全文

(1)

講師:洪安

繼承 Inheritance

(2)

繼承

您可以繼承某個基底(父)類別的定義並加以擴充,

而制訂出一個新的衍生(子)類別定義

例如:繪圖中最基本的點類別,您原先已定義好一 個Point2D類別,您繼承它並將其擴充為Point3D 類別

在繼承的關係中

 被繼承的類別:

「父類別」(Parent class)或「基底類別」(Base class),

 繼承父類別的類別:

「子類別」(Child class)或「衍生類別」(Derived class)

(3)

繼承概念的優點

3

類別再使用(程式碼再使用)

抽象化概念再使用

類別關係階層化

(4)

繼承的概念 (1/2)

靈長類 特徵(屬性)

- 手、足、脊椎、大拇指型態 行為:

- 育兒: 哺乳 - 使用工具

人類 黑猩猩 彌猴

 人類是靈長類的一 種

 人類繼承了靈長類 應有的特徵及行為

 人類繼承了靈長類

(5)

繼承的概念 (2/2)

5

員工(employee)

[屬性]: 姓名、年齡、年資、年薪

[動作]: 計算健保扣除額、計算所得稅

工人 課員 課長 主任 經理

繼承

(6)

繼承的階層

員工(employee)

[屬性]: 姓名、年齡、年資、年薪

[動作]: 計算健保扣除額、計算所得稅

工人 課員 課長 主任 經理

繼承

搬運工 作業員

包裝工 食料調製工

包裝工繼承了員工、工人、作業員 的所有特性

(7)

特性的再使用、新增與修改 (1/2)

7

員工(employee)

[屬性]: 姓名、年齡、年資、年薪

[動作]: 計算健保扣除額、計算所得稅

工人 繼承

搬運工 作業員

包裝工 食料調製工 [屬性]加班時數

[動作] 職業訓練, 計算所得稅

New

New Override

(8)

特性的再使用、新增與修改 (2/2)

靈長類(上古狐猴)

人類 猩猩 猴子

[屬性]: 膚色

[動作] 直立行走 使用工具

New

New

Override

[動作] 手語

New

Nothing New (2) (1)

(3)

(1) 直接繼承 (2) 新增屬性或動作 (3) 修改屬性或動作

(9)

描述物件之間的關係

9

has-a

 Each man has two legs

is-a-kind-of

 工讀生是學校員工的一種

 人是一種靈長類

class man { Leg legs[2] ;

……

} ;

(10)

基底類別(base class)與衍生類別 (derived class)

靈長類(上古狐猴)

人類 猩猩 猴子

Base class (Parent class)

Derived class

(Child class) Derived class (Child class)

Derived class (Child class)

繼承 繼承 繼承

(11)

直接繼承

11

語法

class D 繼承了 class B

class B

class D class B {

int i ; //屬性 public: // 動作

void set_i(int n) { i = n;}

int get_i() { return i; } };class D: public B { } ;

Q: class D 有哪些資 料成員? 成員函數?

i

set_i(), get_i()

set_i(), get_i()

(12)

使用衍生類別

class B {….get_i(); …set_i(int n) ; ..} ; class D: public B { } ;

int main() { D ob ;

ob.set_i(10) ;

cout << ob.get_i() <<endl ; return 0;

}

試試看 2-12.cpp

(13)

新增成員

13

class OneDim{

int x ; public:

void setx(int n) { x = n ;}

void showx() {cout << x <<endl ; } } ;

class TwoDim: public OneDim{

int y ; //新增的data memeber public:

void sety(int n) { y = n ;} // 新增的member functions void showy() {cout << y << endl ; } //新增的functions } ;

int x; int y ; setx(int n) ; showx() ; sety(int n) ; showy() ;

class TwoDim的成員

(14)

使用class TwoDim

int main() { TwoDim td ;

td.setx(5) ; //基底類別 td.sety(10) ; //衍生類別 td.showx(); //基底類別 td.showy() ; //衍生類別 td.x = 10 ; td.y = 20 ;

return 0;

}

對外界(類別使用者)而言,TwoDim的成員 中哪些是 private? 哪些是 public?

(2_Dim.cpp)

int x; int y ; setx(int n) ; showx() ; sety(int n) ; showy() ;

class TwoDim的成員

(15)

在衍生類別中使用基底類別成員 (1/2)

15

class OneDim{

int x ; public:

void setx(int n) { x = n ;}

void showx() {cout << x <<endl ; } } ;

class TwoDim: public OneDim { int y;

public:

void setxy(int a, int b) { x= a; y = b ;}

void showxy() {cout << x << “ “ << y << endl ; } } ;

int x; int y ; setx(int n) ; showx() ;

setxy(int a, int b) ; showxy() ;

class TwoDim的成員

Q: 子類別可以取用

父類別中的私有成員?

(16)

在衍生類別中使用基底類別成員 (2/2)

class OneDim{

int x ; public:

void setx(int n) { x = n ;}

void showx() {cout << x <<endl ; } } ;

class TwoDim: public OneDime { int y;

public:

void setxy(int a, int b) { setx(a); y = b ;}

void showxy() { showx(); cout << y << endl ; } } ;

仔細觀察與上例有何差異?

(2_BaseDerived.cpp)

(17)

基底類別成員存取權

17

private public 基底類別

public 繼承

衍生類別

private public private

public

(18)

修改基底類別成員

Q: 寫出ThreeDim的成員?

class TwoDim { int x, y ; public:

void setxy(int a, int b) { x = a; y = b; }

void show() { cout << x << “ “ << y ;}

};

class ThreeDim : public TwoDim{

int z;

public:

void setxyz(int a, int b, int c) {setxy(a, b); z = c ; }

void show() { TwoDim::show(); cout << “ “ << z ;}

}; Override: 將基底類別的函數重新定義一次 (函數名稱、回傳值及參數均相同)

(19)

課堂練習 (2_3Dim.cpp)

19

Q1: 完成set(int a, int b, int c) Q2: 寫出ThreeDim的成員?

Q3: set()算不算override?

class TwoDim { int x, y ; public:

void set(int a, int b) { x = a; y = b; } void show() { cout << x << “ “ << y ;}

};

class ThreeDim : public TwoDim { int z;

public:

void set(int a, int b, int c) {…….}

void show() { TwoDim::show(); cout << “ “ << z ;}

};

(20)

使用保護成員 (1/2)

class OneDim { int x;

public:

void setx(int a) { x = a ; } void getx() { return x ; } } ;

class TwoDim:public OneDim { int y ;

void distance(TwoDim& pt) {

return sqrt(pow(getx()-pt.getx(),2)+pow(y-pt.y, 2)) ; }

};

Q: 可否直接在TwoDim 取用x?

Q: 缺點?

想在衍生類別中直接使用基底類別的私 有成員,但是外界仍不可直接存取這個 成員

將私有成員改為保護成員

Ans

(21)

使用保護成員 (2/2)

21

class base { protected:

int a, b ; public:

void setab(int n, int m) { a= n ; b=m;}

} ;

class derived: public base { int c ;

public:

void setc(int n) {c = n ;}

void show() { cout << a << ‘ ‘ << b << ‘ ‘ << c <<endl ;}

} ;

(22)

課堂練習

2_Protect.cpp

 將TwoDim類別中的資 料成員宣告為

protected

 實作ThreeDim的成員 函數

void setxyz(int a, int b, int c)

直接設定TwoDim的資料 成員

(23)

公開繼承

class B : public A { // 實作

};

公開繼承時使用public來繼承基底類別,繼承下來的 成員在衍生類別中的權限變為如下:

基底類別 衍生類別

private 不繼承

protected protected

public public

23

(24)

保護繼承

class B : protected A { // 實作

};

保護繼承時使用protected來繼承基底類別,繼承下 來的成員在衍生類別中的權限變為如下:

基底類別 衍生類別

private 不繼承

protected protected public protected

(25)

私有繼承

class B : private A { // 實作

};

基底類別中的成員在被繼承之後,其權限如下所示:

基底類別 衍生類別

private 不繼承

protected private public private

25

(26)

class A

public:a1 protected: a2 private: a3 公開繼承

(public)

class B

public:a1 protected: a2 a3

保護繼承 (protected)

class C

protected:a1 protected: a2 a3

私有繼承 (private)

class D

private:a1 private: a2 a3

物件A

A.a1 A.a2 A.a3

物件 B

B.a1 B.a2

B.a3 物件 C

C.a1 C.a2

C.a3 物件D

D.a1 D.a2 D.a3

(27)

課堂練習

三種繼承 (2_ClassInheritance.cpp)

27

參考文獻

相關文件

– at a premium (above its par value) when its coupon rate c is above the market interest rate r;. – at par (at its par value) when its coupon rate is equal to the market

– at a premium (above its par value) when its coupon rate c is above the market interest rate r;. – at par (at its par value) when its coupon rate is equal to the market

第一梯次 第二梯次 第二梯次 第二梯次 第二梯次 第三梯次 第三梯次 第三梯次 第三梯次 2.未來將停辦職類 未來將停辦職類 未來將停辦職類 未來將停辦職類、 、 、 、級別 級別 級別 級別:

第一梯次 第二梯次 第二梯次 第二梯次 第二梯次 第三梯次 第三梯次 第三梯次 第三梯次 2.未來將停辦職類 未來將停辦職類 未來將停辦職類 未來將停辦職類、 、 、 、級別 級別 級別 級別:

第一梯次 第二梯次 第二梯次 第二梯次 第二梯次 第三梯次 第三梯次 第三梯次 第三梯次 2.未來將停辦職類 未來將停辦職類 未來將停辦職類 未來將停辦職類、 、 、 、級別 級別 級別 級別:

收費原則 :CCC Code前6碼相同者歸為1類 登錄10個類別以 內收費 NT$5,000. 超過10個類別每類加收費 NT$1,000(超過部分)

•Q :依據討論出的檢核標 準,評核這些組的內容.. •小組討論 (

以下 Java 程式執行完後,輸出結果為何?(A)無法編譯,因為 Rectangle 類別不能同時 extends 一個類別且 implemets 一個介面(B)無法編譯,因為 Shapes 類別沒有