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

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
项目7 面向对象高级.
第四章 继承与派生 Chapter 4 Inheritance and Derivation
第6章 多态性与虚函数.
11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20
類別與物件 Class & Object.
第7单元 面向过程编程—— 继承与多态.
第八章 类和对象.
Ch08 巢狀類別 物件導向程式設計(II).
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第二章 C# 基础知识.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Ch13 集合與泛型 物件導向程式設計(2).
Visual C++ Windows Programming
第三章 C#面向对象初级编程 面向对象得程序设计越来越受到编程人员的喜爱。类和对象是面向对象程序设计中的重要概念。封装性、继承性和多态性是面向对象的特点,本章旨在全面说明C#编写面向对象程序设计的方法。
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
程式設計實作.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
Object-Oriented Programming:
第3章 继承和派生.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
類別(class) 類別class與物件object.
第四章 小技巧.
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
Java 程式設計 講師:FrankLin.
Visual C++ Windows Programming
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
Instructor Textbook Requirements TAs C++程式設計風格與藝術 (O’Reilly).
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第一單元 建立java 程式.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 QQ: 学习网站:
第12讲 多继承与虚基类 多继承 虚基类.
潘爱民 C++ Overview 潘爱民
第六章 簡介運算子超載 (Operator Overloading)
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Visual C++ Windows Programming
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Inheritance -II.
樣版.
第三章 数据抽象.
Object-Oriented Programming in C++ 第二章 类和对象
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
繼承的優點 程式碼再使用 (code reuse) 抽象概念再使用 類別階層化 澄清物件間的關係.
面向对象技术 练习 ffh.
第九章 物件導向-進階.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
辅导课程十一.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
谭浩强编著 C++面向对象程序设计 授课教师:姬广永 学习网站:
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
第2章 Java语言基础.
Object-Oriented Programming
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
第6章 继承和多态 伍孝金
Presentation transcript:

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

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

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

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

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

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

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

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

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

使用衍生類別 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 ; }

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

二、新增成員 int x; int y ; setx(int n) ; showx() ; sety(int n) ; showy() ; class TwoDim的成員 class OneDim{ int x ; public: 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; int y ; setx(int n) ; showx() ; sety(int n) ; void main() { TwoDim td ; td.setx(5) ; //基底類別 td.sety(10) ; //衍生類別 td.showx(); //基底類別 td.showy() ; //衍生類別 // try, 可乎? td.x = 10 ; td.y = 20 ; } int x; int y ; setx(int n) ; showx() ; sety(int n) ; showy() ; 對外界(類別使用者)而言,TwoDim的成員中 x,y 哪些是 private? 哪些是 public?

在衍生類別中使用基底類別成員 class TwoDim的成員 class OneDim{ int x ; public: 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 ; } int x; int y ; setx(int n) ; showx() ; setxy(int a, int b) ; showxy() ; Q: 子類別可以取用 父類別中的私有成員? 否

在衍生類別中使用基底類別成員 class OneDim{ int x ; public: 仔細觀察與上例 有何差異? 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 ; } 仔細觀察與上例 有何差異?

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

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

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

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

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

EX: 回答以下問題 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; void set(int a, int b, int c) {…….} void show() { TwoDim::show(); cout << “ “ << z ;} } ; Q1: 完成set(int a, int b, int c) Q2: 寫出ThreeDim的成員? Q3: set()算不算override? ,yes

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

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

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

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

增加程式碼的再使用率 class TwoDim { int x, y ; public: 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 ;}

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

後記: 回憶Window Programming #include <afxwin.h> //載入afxwin標頭檔 class MyApp : public CWinApp //繼承CWinApp { public: 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; //建立應用程式物件

7-2 使用保護成員 Q: 缺點? class OneDim { int x; public: Q: 我可否直接在TwoDim 取用x? 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: 缺點?

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

範例一 class samp { int a ; protected: int b ; public: 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 ; }

範例二 void main() class base { { protected: derived d; int a, b ; public: 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(); }

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

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

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

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

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

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

範例一: 生成與消滅的次序 class base { public: 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

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

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

範例三 class base { int i ; public: 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 ; public: derived(int n):base(n){ j = n ; } derived(int a, int b):base(a) { j = b; };

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