第七章 繼承

Similar documents
運算子多載 Operator Overloading

Strings

第七讲 继承与多态

PowerPoint Presentation

第十章 虛擬函數 (Virtual Functions)

untitled

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

Microsoft PowerPoint - L17_Inheritance_v4.pptx

Strings

Microsoft Word - chap10.doc

Microsoft Word - ch04三校.doc

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

Chapter12 Derived Classes

FY.DOC

Microsoft Word - 新1-12.doc

Microsoft Word 軟體設計第二部份範例試題_C++_ _1_.doc

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

untitled

untitled

新版 明解C++入門編

Microsoft Word cppFinalSolution.doc

untitled

第二章 簡介類別

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Microsoft PowerPoint - P766Ch06.ppt

c_cpp

untitled

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

untitled

第3章.doc

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

ebook55-13

Microsoft PowerPoint - 13_ClassAndObj.ppt

Microsoft Word - 01.DOC

《大话设计模式》第一章

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

ebook39-5

提问袁小兵:

C 1

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

運算子多載 Operator Overloading

java2d-4.PDF

相 应 功 能 (5) 再 将 Boy 类 作 为 Girl 类 的 友 元 类, 在 Boy 类 的 某 成 员 函 数 VisitGirl(Girl & ) 中 访 问 Girl 类 的 私 有 成 员, 观 察 编 译 器 给 出 的 信 息 ( 6 ) 删 除 两 个 类 中 的 函 数 V

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

untitled

公開徵求廠商提供「採購專業人員訓練計畫企劃書」公告

untitled

untitled

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

untitled

( 总 第 1073 期 ) 浙 江 省 人 民 政 府 主 办 2015 年 3 月 17 日 出 版 省 政 府 令 省 政 府 文 件 目 录 浙 江 省 大 型 群 众 性 活 动 安 全 管 理 办 法 ( 浙 江 省 人 民 政 府 令 第 333 号 ) (3) 浙 江 省 人 民 政

untitled

NethersoleJO89(8).indd

1.5招募说明书(草案)

ex

PowerPoint 簡報

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

Microsoft Word - JAVA Programming Language Homework I ans

Microsoft PowerPoint - 11_Templates.ppt

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Microsoft Word - 物件導向編程精要.doc

踏出C++的第一步

李佳壕 林秋慧 指導老師 曹舜為 推薦學校 南投縣私立同德家事商業職業學校 林秋慧 夏日海鮮西瓜香 ( 李佳壕) (一) 干貝1顆 紅魚卵少許 芝麻葉少許 牛番茄 1顆 洋蔥50公克 黃西瓜20公克 紅西瓜20 公克 蒜頭20公克 辣椒10公克 香菜5公 克 巴西利5公克 (一) 紅西瓜1/4顆 黃

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

建模与图形思考

Microsoft PowerPoint - 09_Inheritance.ppt

关于规范区委、区委办公室发文

Microsoft Word - ??山

Microsoft Word - 助理人員教育訓練-會計室.docx

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

投影片 1

概述

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

EJB-Programming-3.PDF

Chapter 9: Objects and Classes

产 煤 省 ( 自 治 区 直 辖 市 ) 中 的 20 个, 见 图 1, 且 主 要 分 布 在 我 国 西 南 和 中 东 部 地 区 所 属 矿 井 全 部 为 突 出 矿 井 ; 乡 镇 煤 矿 中 6 郾 1% 的 矿 井 属 于 突 出 矿 井 图 3 摇 突 出 矿 井 企 业 属

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

untitled

C/C++语言 - C/C++数据

(procedure-oriented)?? 2

幻灯片 1

Microsoft PowerPoint - plan08.ppt

untitled

INTRODUCTION TO COM.DOC

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

ebook39-6

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

untitled

全国计算机技术与软件专业技术资格(水平)考试

Chapter 9: Objects and Classes

Transcription:

繼承概念的優點 類別再使用 ( 程式碼再使用 ) 抽象化概念再使用 類別關係階層化 1

2-3 簡介繼承 Q: Q: 人 黑猩猩與猴子的有哪些共同屬性? 繼承 靈長類特徵 (( 屬性 )) -- 手 足 脊椎 大拇指型態行為 :: -- 育兒 :: 哺乳 -- 使用工具 人類 黑猩猩 彌猴 人類是靈長類的一種 人類繼承了靈長類應有的特徵及行為 人類繼承了靈長類 2

繼承的概念 員工 (employee) [ 屬性 ]: 姓名 年齡 年資 年薪 [ 動作 ]: 計算健保扣除額 計算所得稅繼承 工人 課員 課長 主任 經理 3

繼承階層圖 員工 (employee) [ 屬性 ]: 姓名 年齡 年資 年薪 [ 動作 ]: 計算健保扣除額 計算所得稅繼承 工人 課員 課長 主任 經理 搬運工 作業員 包裝工繼承了員工 工人 作業員的所有特性 包裝工 食料調製工 4

請問包裝工的屬性與動作?特性的再使用 新增與修改 員工 (employee) [ 屬性 ]: 姓名 年齡 年資 年薪 [ 動作 ]: 計算健保扣除額 計算所得稅 繼承 搬運工 工人 包裝工 [ 屬性 ] 加班時數 作業員 New Override [ 動作 ] 職業訓練, 計算所得稅 食料調製工 New 5

特性的再使用 新增與修改 (1) 直接繼承 (2) 新增屬性或動作 (3) 修改屬性或動作 靈長類 ( 上古狐猴 ) 靈長類 ( 上古狐猴 ) ( 三 ) ( 二 ) 人類 猩猩 ( 一 ) 猴子 [ 屬性 ]: 膚色 New [ 動作 ] 直立行走使用工具 New Override [ 動作 ] 手語 New Nothing New 6

基底類別 (basis class) 與 衍生類別 (derived class) Basis class (Parent class) 靈長類 ( 上古狐猴 ) 靈長類 ( 上古狐猴 ) 繼承 人類 Derived class (Child class) 繼承 猩猩 Derived class (Child class) 繼承 猴子 Derived class (Child class) 7

一 直接繼承 繼承的語法 class B { int i ; // 屬性 // 動作 void set_i(int n) { i = n;} int get_i() { return i; } }; class D: public B { class D 繼承了 class B class D 繼承了 class B class B class D 8

直接繼承 class B { int i ; // 屬性 // 動作 void set_i(int n) { i = n;} int get_i() { return i; } }; class D: public B { Q: class D 有哪些資料成員? 成員函數? i B set_i(), get_i() i D set_i(), get_i() 9

使用衍生類別 class B {.get_i(); set_i(int n) ;.. class D: public B { void main() { D ob ; ob.set_i(10) ; cout << ob.get_i() <<endl ; } 10

衍生類別的內容 ( 或任務 ) (1) 直接繼承 (2) 新增屬性或動作 (3) 修改屬性或動作 靈長類 ( 上古狐猴 ) 靈長類 ( 上古狐猴 ) 人類 猩猩 猴子 [ 屬性 ]: 膚色 New [ 動作 ] 直立行走使用工具 New Override [ 動作 ] 手語 New Nothing New 11

二 新增成員 class OneDim{ int x ; void setx(int n) { x = n ;} void showx() {cout << x <<endl ; } class TwoDim: public OneDim { int y ; // 新增的 data memeber void sety(int n) { y = n ;} // 新增的 member functions void showy() {cout << y << endl ; } // 新增的 functions class TwoDim 的成員 int x; x; int y ;; setx(int n) n) ;; showx() ;; sety(int n) n) ;; showy() ;; 12

使用 class TwoDim void main() { TwoDim td ; td.setx(5) ; // 基底類別 td.sety(10) ; // 衍生類別 td.showx(); // 基底類別 td.showy() ; // 衍生類別 // try, 可乎? td.x = 10 ; td.y = 20 ; } class TwoDim 的成員 int x; x; int y ;; setx(int n) n) ;; showx() ;; sety(int n) n) ;; showy() ;; 對外界 ( 類別使用者 ) 而言,TwoDim 的成員中哪些是 private? 哪些是 public? 13

在衍生類別中使用基底類別成員 class OneDim{ int x ; void setx(int n) { x = n ;} void showx() {cout << x <<endl ; } class TwoDim: public OneDim { int y; void setxy(int a, int b) { x= a; y = b ;} void showxy() {cout << x << << y << endl ; } class TwoDim 的成員 int intx; x; int inty ;; setx(int n) n) ;; showx() ;; setxy(int a, a, int intb) b) ;; showxy() ;; Q: Q: 子類別可以取用父類別中的私有成員? 14

在衍生類別中使用基底類別成員 class OneDim{ int x ; void setx(int n) { x = n ;} void showx() {cout << x <<endl ; } class TwoDim: public OneDim { int y; void setxy(int a, int b) { setx(a); y = b ;} void showxy() { showx(); cout << y << endl ; } 仔細觀察與上例有何差異? 15

父類別成員存取權 基底類別 衍生類別 衍生類別使用者 private public public 繼承 private public 16

父類別成員存取權 基底類別 衍生類別 private public public 繼承 private public 17

EX: 完成以下程式 class ThreeDim: public TwoDim { int z ; setxyz(int a, int b, int c) {.} showxyz() {.} 先寫出 ThreeDim 有哪些成員? 18

三 修改基底類別成員 class TwoDim { int x, y ; void setxy(int a, int b) { x = a; y = b; } void show() { cout << x << << y ;} }; Q: 寫出 ThreeDim 的成員? Q: 寫出 ThreeDim 的成員? class ThreeDim :public TwoDim { int z; void setxyz(int a, int b, int c) {setxy(a, b); z = c ; } void show() { TwoDim::show(); cout << << z ;} Override: 將父類別的函數重新定義一次 (( 函數名稱 回傳值均相同 )) 19

使用 ThreeDim void main() { ThreeDim point3d ; point3d.setxyz(1,2,3) ; // 呼叫誰的 set() point3d.show() ; // 呼叫誰的 show() } 20

EX: 回答以下問題 class TwoDim { int x, y ; void set(int a, int b) { x = a; y = b; } void show() { cout << x << << y ;} }; class ThreeDim :public TwoDim { int z; void set(int a, int b, int c) {.} void show() { TwoDim::show(); cout << << z ;} Q1: 完成 set(int a, a, int intb, b, int intc) c) Q2: 寫出 ThreeDim 的成員? Q3: set() 算不算 override? 21

2-3 範例一 fruit name, color getname() getcolor() set(name, color) color: red, yellow, green, orange Apple cooking set(name, color, cooking) show() Orange juicy set(name, color, juicy) show() 22

main() void main() { Apple a; Orange o ; a.set( Washington, red, yes) ; a.show(); o.set( Sunkys, orange, false) ; b.show() ; } 23

繼承的用處 描述物件間 is-a-kind of 的關係 提昇程式碼的再使用率 有利於類別的更新與修正 24

描述物件之間的關係 has-a Each man has two legs class man { Leg legs[2] ; is-a-kind-of 工讀生是學校員工的一種 人是一種靈長類 25

增加程式碼的再使用率 class TwoDim { int x, y ; void setxy(int a, int b) { x = a; y = b; } void show() { cout << x << << y ;} } class ThreeDim { int z; void setxyz(int a, int b, int c) {setxy(a, b); z = c ; } void show() { TwoDim::show(); cout << << z ;} } 26

有利於類別的更新與修正 當你使用的類別庫設計不良或有所不足時, 該如何? // 你覺得需要一個 int sum(); // 你覺得 delete(int value) 效率很差 class list {. // data member void insert(int n) {.} void delete(int value) { } void show() { } 27

後記 : 回憶 Window Programming #include <afxwin.h> // 載入 afxwin 標頭檔 class MyApp : public CWinApp // 繼承 CWinApp { BOOL InitInstance() // 程式進入點 { CFrameWnd *Frame = new CFrameWnd(); // 建立 CFrameWnd 物件 ( 產生 ) m_pmainwnd = Frame; // 將 m_pmainwnd 設定為 Frame Frame->Create(NULL,"Hello MFC"); // 建立視窗 ( 建立 ) Frame->ShowWindow(SW_SHOW); return true; } }; MyApp a_app; // 建立應用程式物件 28

7-2 使用保護成員 class OneDim { int x; void setx(int a) { x = a ; } void getx() { return x ; } class TwoDim:public OneDim { int y ; void distance(twodim& pt) { } } Q: Q: 我可否直接在 TwoDim 取用 x? x? Q: 缺點? return sqrt(pow(getx()-pt.getx(),2), pow(y-pt.y, 2)) ; 29

需求 我想在子類別中直接使用父類別的私有成員, 但是外界仍不可直接存取這個成員 將私有成員改成保護成員 30

範例一 class samp { int a ; protected: int b ; int c ; samp(int n, int m) { a = n; b=m; } void main() { samp ob(10, 20) ; ob.a = 10; ob.b = 20; ob.c = 30 ; } 31

範例二 class base { protected: int a, b ; void setab(int n, int m) { a= n ; b=m;} class derived: public base { int c ; void setc(int n) {c = n ;} void show() { cout << a << << b << << c <<endl ;} void main() { derived d; d.setab(10,20); d.setc(30); d.show(); } 32

7-1 基底類別存取控制 class OneDim { } class TwoDim: public OneDim { } 33

公有繼承 (public) class Base { private: int a ; protected: int b; int c; class Derived: public Base { // int a; private // int b; protected // int c; public }; void main() { Derived d ; // a, b: private // c: public } 34

私有繼承 (private) class Base { private: int a ; protected: int b; int c; class Derived: private Base { // int a; private // int b; private // int c; private }; void main() { Derived d ; // a, b, c: private } 35

保護繼承 (protected) class Base { private: int a ; protected: int b; int c; class Derived: protected Base { // int a; private // int b; protected // int c; protected }; void main() { Derived d ; // a, b, c: private } 36

7-3 建構子 解構子與繼承 以下成員不會被子類別繼承 (1) 建構子 解構子與 operator=() (2) 夥伴函數 class B { int x ; B(int n) { x = n ;} class D: public B { void main() { D d(10) ; } 37

物件欄位的生成消滅次序 class employee { string name ; int ID ; class worker: public employee { float overtime ; void main() { worker w ; } name ID Overtime 38

範例一 : 生成與消滅的次序 class base { base() { cout << base constructing <<endl;} ~base() { cout << base destructing <<endl;} class derived: public base { derived() { cout << derived constructing <<endl;} ~derived() { cout << derived destructing <<endl;} base constructing derived constructing derived destructing base destructing 39

範例二 : 傳引數給衍生類別建構子 class base { base() { } ~base() { } class derived: public base { int j ; derived(int n) { j = n ;} ~derived() { } }; void main() { } derived ob(10) ; 40

成員的初始化 : 使用 Initializer class point { int x, y ; public point(const point& p):x(p.x), y(p.y) { } class triangle { point pt1, pt2, pt3; triangle(point p1, point p2, point p3):pt1(p1), pt2(p2), pt3(p3) {} 41

範例三 class base { int i ; base(int n) { i =n;} // 接 class derived void main() { derived d1(10) ; // i=j=10 derived d2(5, 3) ; //i=5,j=3 } class derived: public base { int j ; derived(int n):base(n){ j = n ; } derived(int a, int b):base(a) { j = b; } }; 42

練習題 (p. 7-19) 習題一 習題二 43