11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
第四章 继承与派生 Chapter 4 Inheritance and Derivation
四資二甲 第三週作業 物件導向程式設計.
第九讲 类与对象 (I)面向对象基础.
第6章 多态性与虚函数.
類別與物件 Class & Object.
Virtual Function Jing(井民全).
第十一章 繼承類別和朋友關係.
第八章 类和对象.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第四章 在 C# 中实现 OOP 概念.
JAVA 程式設計與資料結構 第七章 繼承與Interface.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
哈夫曼编码.
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
Object-Oriented Programming:
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
第3章 继承和派生.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
類別(class) 類別class與物件object.
第四章 小技巧.
第七章 檔案處理.
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
繼承概念的優點 類別再使用(程式碼再使用) 抽象化概念再使用 類別關係階層化.
Java 程式設計 講師:FrankLin.
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第六章 属性、索引器、委托和事件.
第一單元 建立java 程式.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第 19 章 XML記憶體執行模式.
第12讲 多继承与虚基类 多继承 虚基类.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Inheritance -II.
樣版.
第三章 数据抽象.
C qsort.
Object-Oriented Programming in C++ 第二章 类和对象
面向对象技术 练习 ffh.
第九章 物件導向-進階.
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第 5 章 继承、多态和虚函数 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
谭浩强编著 C++面向对象程序设计 授课教师:姬广永 学习网站:
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Object-Oriented Programming
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
變數與資料型態  綠園.
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

11 繼承類別 11.4 建立者與破壞者 11-19 11.4.1 單一建立者與破壞者 11-20 11 繼承類別 11.1 繼承概論 11-2 11.1.1 基礎類別與衍生類別 11-2 11.1.2 繼承型式 11-2 11.1.3 保護成員 11-2 11.2 單一類別繼承 11-3 11.2.1 公用型態的繼承 11-3 11.2.2 私用型態的繼承 11-7 11.2.3 保護型態的繼承 11-10 11.3 多重類別繼承 11-12 11.3.1 多層類別繼承 11-12 11.3.2 多重類別繼承 11-16 11.4 建立者與破壞者 11-19 11.4.1 單一建立者與破壞者 11-20 11.4.2 多層建立者與破壞者 11-21 11.4.3 多重建立者與破壞者 11-22 11.4.4 傳遞參數到基礎建立者 11-24 11.5 繼承與包含 11-26 11.5.1 繼承類別 11-26 11.5.2 包含類別 11-28

11.1 繼承概論 繼承(inheritance)的功能讓程式可以重複使用。例如,建立新類別時,使用繼承功能去吸收已存在類別的特性與功能到新類別中,如此可以節省許多程式開發的時間,所以繼承是處理複雜程式很有效率的技術。

11.1.1 基礎類別與衍生類別 當建立新類別時,使用繼承功能去繼承已存在類別的資料成員與成員函數,來取代重新撰寫新的資料成員與新的成員函數。 這已存在的類別稱為基礎類別(base class)或父類別(parent class),而新建立的類別稱為衍生類別(derived class)或子類別(child class)。 在衍生類別中可以新增自己的資料成員與成員函數,將來衍生類別也可能成為新建類別的基礎類別。

11.1.2 繼承型式 C++ 提供公用(public)、私用(private)與保護(protected)三種繼承型式。 11.1.2 繼承型式 C++ 提供公用(public)、私用(private)與保護(protected)三種繼承型式。 在public繼承型式中,衍生類別只能存取基礎類別中public與protected的成員,而不能直接存取基礎類別中private的成員,但可透過基礎類別中public與protected的成員函數間接存取基礎類別的private成員。

11.1.3 保護成員 存取基礎類別的protected 成員的,則是介於存取public與private成員之間,基礎類別的protected成員可被基礎類別與衍生類別的成員函數與friend函數所存取。 所以對於衍生類別的成員函數而言,可以直接使用public與protected成員名稱存取該資料成員。 而對於其他類別(非衍生類別)的成員函數而言,則不可直接存取protected與private資料成員,必須透過public成員函數來存取protected與private資料成員。

11.2 單一類別繼承

11.2.1 公用型態的繼承 class 衍生類別: public 基礎類別 基礎類別 衍生類別 其他類別 基礎類別成員型態 11.2.1 公用型態的繼承 class 衍生類別: public 基礎類別 基礎類別 衍生類別 其他類別 基礎類別成員型態 存取基礎類別成員 繼承後成員型態 存取衍生類別成員 private成員 (否) protected成員 (可) public成員

11.2.1 公用型態的繼承 (續) 建立基礎類別 class Base { int a, b; public: 11.2.1 公用型態的繼承 (續) 建立基礎類別 class Base { int a, b; public: void set(int n, int m) {a = n; b = m;} void show() {cout << a << " " << b << endl;} };

11.2.1 公用型態的繼承 (續) 建立衍生類別 class Derived: public Base { int c; public: 11.2.1 公用型態的繼承 (續) 建立衍生類別 class Derived: public Base { int c; public: Derived() {c = 0;} Derived(int n) {c = n;} void setc() {c = a * b;} //錯誤!不可直接存取a, b void showc() {cout << c;} };

11.2.1 公用型態的繼承 (續) Derived物件可以呼叫Base與Derived類別的public函數 int main() { 11.2.1 公用型態的繼承 (續) Derived物件可以呼叫Base與Derived類別的public函數 int main() { Derived d(10); //c = 10 d.set(2,3); //a=2, b=3 d.show(); //顯示2與3 d.showc(); //顯示10 }

11.2.2 私用型態的繼承 class 衍生類別: private 基礎類別 基礎類別 衍生類別 其他類別 基礎類別成員型態 11.2.2 私用型態的繼承 class 衍生類別: private 基礎類別 基礎類別 衍生類別 其他類別 基礎類別成員型態 存取基礎類別成員 繼承後成員型態 存取衍生類別成員 private成員 (否) protected成員 (可) public成員

11.2.2 私用型態的繼承 (續) 建立Base類別 class Base { protected: int a, b; public: 11.2.2 私用型態的繼承 (續) 建立Base類別 class Base { protected: int a, b; public: void set(int n, int m) {a = n; b = m;} void show() {cout << a << " " << b << endl;} };

11.2.2 私用型態的繼承 (續) Derived類別是以private型態繼承Base類別 11.2.2 私用型態的繼承 (續) Derived類別是以private型態繼承Base類別 class Derived: private Base { protected: int c; public: Derived(int num) {c = num;} void setab(int n, int m) { set(n, m); } //呼叫Base::set() void showab() {show();} //呼叫Base::show() void showc() {cout << c;} };

11.2.2 私用型態的繼承 (續) Derived物件只可以呼叫Derived類別的public函數 int main() { 11.2.2 私用型態的繼承 (續) Derived物件只可以呼叫Derived類別的public函數 int main() { Derived d(10); //c=10 d.set(20,30); //錯誤,不能直接呼叫set d.setab(20,30); //呼叫Derived的setab d.show(); //錯誤,不能直接呼叫show d.showab(); //呼叫Derived的showab d.showc(); //呼叫Derived的showc return 0; //正常結束程式 }

11.2.3 保護型態的繼承 class 衍生類別: protected 基礎類別 基礎類別 衍生類別 其他類別 基礎類別成員型態 11.2.3 保護型態的繼承 class 衍生類別: protected 基礎類別 基礎類別 衍生類別 其他類別 基礎類別成員型態 存取基礎類別成員 繼承後成員型態 存取衍生類別成員 private成員 (否) protected成員 (可) public成員

11.2.3 保護型態的繼承 (續) 建立Base類別 class Base { private: int a; protected: 11.2.3 保護型態的繼承 (續) 建立Base類別 class Base { private: int a; protected: int b; public: int c; void seta(int n) {a = n;} void geta() {return a;} };

11.2.3 保護型態的繼承 (續) Derived類別是以protected型態繼承Base類別 11.2.3 保護型態的繼承 (續) Derived類別是以protected型態繼承Base類別 class Derived:protected Base { public: void setb(int n) {b = n;} //可直接設定protected值 int getb() {return b;} //可直接取得protected值 void setc(int n) {c = n;} //可直接設定public值 int getc() {return c;} //可直接取得public值 void seta1(int n) {seta(n);} //呼叫seta()間接設定a值 void geta1() {geta();} //呼叫geta()間接取得a值 };

11.2.3 保護型態的繼承 (續) Derived物件只可以呼叫Derived類別的public函數 int main() { 11.2.3 保護型態的繼承 (續) Derived物件只可以呼叫Derived類別的public函數 int main() { Derived d; d.seta(20); //錯,不可呼叫Base的公用函數 d.seta1(20); //呼叫Derived的公用函數 cout << d.geta(); //錯,不可呼叫Base的公用函數 cout << d.geta1(); //呼叫Derived的公用函數 d.c = 10; //錯,不可存取Base的公用函數 d.setc(10); //c = 10 cout << d.getc(); //顯示10 return 0; //正常結束程式 }

11.3 多重類別繼承 多重繼承的狹義定義是衍生類別直接繼承了多個基礎類別如11.3.2節的多重繼承,而多重繼承的廣義定義是衍生類別直接與間接繼承了多個基礎類別如11.3.1節的多層繼承與11.3.2節的多重繼承。

11.3.1 多層類別繼承

11.3.1 多層類別繼承 (續) 建立Base類別 Class Base { protected: int a, b; public: 11.3.1 多層類別繼承 (續) 建立Base類別 Class Base { protected: int a, b; public: void set(int n, int m) {a = n; b = m;} void show() {cout << a << " " << b << endl;} };

11.3.1 多層類別繼承 (續) Derived1類別以public型態繼承Base類別 11.3.1 多層類別繼承 (續) Derived1類別以public型態繼承Base類別 class Derived1: public Base { protected: int c; public: void setc() {c = a * b;} //直接取得Base的a, b void showc() {cout << c;} };

11.3.1 多層類別繼承 (續) Derived2 類別以public型態繼承Derived1類別 11.3.1 多層類別繼承 (續) Derived2 類別以public型態繼承Derived1類別 class Derived2: public Derived1 { protected: int d; public: void setd() {d = a - b;} //直接取得Base的a, b void showd() {cout << d << endl;} };

11.3.1 多層類別繼承 (續) Derived1與Derived2物件 int main() { Derived1 d1; 11.3.1 多層類別繼承 (續) Derived1與Derived2物件 int main() { Derived1 d1; Derived2 d2; d1.set(2,5); //a=2, b=5 d1.show(); //輸出2 5 d1.setc(); //c=a*b=2*5=10 d1.showc(); //輸出10 d2.set(3,4); //a=3, b=4 d2.show(); //輸出3 4 d2.setc(); //c=a*b=3*4=12 d2.showc(); //輸出12 d2.setd(); //d=a-b=3-4=-1 d2.showd(); //輸出-1 return 0; //正常結束程式 }

11.3.2 多重類別繼承

11.3.2 多重類別繼承 (續) 建立Base1類別 Class Base1 { protected: int x; public: 11.3.2 多重類別繼承 (續) 建立Base1類別 Class Base1 { protected: int x; public: void showx() {cout << x << endl;} };

11.3.2 多重類別繼承 (續) 建立Base2類別 Class Base2 { protected: int y; public: 11.3.2 多重類別繼承 (續) 建立Base2類別 Class Base2 { protected: int y; public: void showy() {cout << y << endl;} };

11.3.2 多重類別繼承 (續) Derived類別以public型態繼承Base1與Base2類別 11.3.2 多重類別繼承 (續) Derived類別以public型態繼承Base1與Base2類別 class Derived: public Base1, public Base2 { public: void set(int i, int j) {x = i; y = j;} };

11.3.2 多重類別繼承 (續) Derived物件可以呼叫Base1與Base2類別的public函數 int main() { 11.3.2 多重類別繼承 (續) Derived物件可以呼叫Base1與Base2類別的public函數 int main() { Derived d; d.set(2,3); //設定x=2, y=3 d.showx(); //輸出x = 2 d.showy(); //輸出y = 3 return 0; //正常結束程式 }

11.4 建立者與破壞者 建立衍生類別物件時,會先呼叫基礎類別的建立者,再呼叫衍生類別的建立者。而結束衍生類別物件時,則以相反順序先呼叫衍生類別的破壞者,再呼叫基礎類別的破壞者。也就是先建立者後破壞(first-construct-last-destruct)。

11.4.1 單一建立者與破壞者

11.4.1 單一建立者與破壞者 (續) 建立Base類別 class Base { public: 11.4.1 單一建立者與破壞者 (續) 建立Base類別 class Base { public: Base() {cout << "建立基礎類別\n";} ~Base() {cout << "破壞基礎類別\n";} };

11.4.1 單一建立者與破壞者 (續) 建立Derived類別 class Derived: public Base { public: 11.4.1 單一建立者與破壞者 (續) 建立Derived類別 class Derived: public Base { public: Derived() {cout << "建立衍生類別\n";} ~Derived() {cout << "破壞衍生類別\n";} };

11.4.1 單一建立者與破壞者 (續) 建立Derived物件d時,先呼叫Base(建立者)函數再呼叫Derived(建立者)函數。而結束main函數時則先呼叫~Derived(破壞者)函數再呼叫~Base(破壞者)函數。 int main() { Derived d; return 0; //正常結束程式 }

11.4.2 多層建立者與破壞者

11.4.2 多層建立者與破壞者 (續) 建立Base類別 class Base { public: 11.4.2 多層建立者與破壞者 (續) 建立Base類別 class Base { public: Base() {cout << "建立基礎類別\n";} ~Base() {cout << "破壞基礎類別\n";} };

11.4.2 多層建立者與破壞者 (續) 是建立Derived1類別,並以public型態繼承Base類別 11.4.2 多層建立者與破壞者 (續) 是建立Derived1類別,並以public型態繼承Base類別 class Derived1: public Base { public: Derived1() {cout << "建立衍生類別\n";} ~Derived1() {cout << "破壞衍生類別\n";} };

11.4.2 多層建立者與破壞者 (續) 建立Derived2類別,並以public型態繼承Derived1類別 11.4.2 多層建立者與破壞者 (續) 建立Derived2類別,並以public型態繼承Derived1類別 class Derived2: public Derived1 { public: Derived2() {cout << "建立衍生類別2\n";} ~Derived2() {cout << "破壞衍生類別2\n";} };

11.4.2 多層建立者與破壞者 (續) 建立Derived2物件d時,先呼叫Base(建立者)函數,再呼叫Derived1(建立者)函數,最後呼叫Derived2(建立者)函數。而結束main函數時則先呼叫~Derived2(破壞者)函數,再呼叫~Derived1(破壞者)函數,最後呼叫~Base(破壞者)函數。 int main() { Derived2 d; return 0; //正常結束程式 }

11.4.3 多重建立者與破壞者

11.4.3 多重建立者與破壞者 (續) 建立Base1類別 class Base1 { public: 11.4.3 多重建立者與破壞者 (續) 建立Base1類別 class Base1 { public: Base1() {cout << "建立基礎類別1\n";} ~Base1() {cout << "破壞基礎類別1\n";} };

11.4.3 多重建立者與破壞者 (續) 建立Base2類別 class Base2 { public: 11.4.3 多重建立者與破壞者 (續) 建立Base2類別 class Base2 { public: Base2() {cout << "建立基礎類別2\n";} ~Base2() {cout << "破壞基礎類別2\n";} };

11.4.3 多重建立者與破壞者 (續) 建立Derived類別,並以public型態繼承Base1與Base2類別 11.4.3 多重建立者與破壞者 (續) 建立Derived類別,並以public型態繼承Base1與Base2類別 class Derived: public Base1, public Base2 { public: Derived() {cout << "建立衍生類別\n";} ~Derived() {cout << "破壞衍生類別\n";} };

11.4.3 多重建立者與破壞者 (續) 建立Derived物件d時,呼叫先繼承的Base1(建立者)函數,再呼叫後繼承的Base2(建立者)函數,最後呼叫Derived(建立者)函數。而結束main函數時則先呼叫~Derived(破壞者)函數,再呼叫~Base2(破壞者)函數,最後呼叫~Base1(破壞者)函數。 int main() { Derived d; return 0; //正常結束程式 }

11.4.4 傳遞參數到基礎建立者 建立Base類別 class Base { protected: int i; public: 11.4.4 傳遞參數到基礎建立者 建立Base類別 class Base { protected: int i; public: Base(int x) {i = x;} };

11.4.4 傳遞參數到基礎建立者 (續) 建立Derived類別,並宣告以public型態繼承Base類別 11.4.4 傳遞參數到基礎建立者 (續) 建立Derived類別,並宣告以public型態繼承Base類別 class Derived: public Base { protected: int j; public: Derived(int a, int b): Base(a) //i = 參數a {j = b;} //j = 參數b };

11.4.4 傳遞參數到基礎建立者 (續) 建立Derived物件d(10, 20) 時,參數a=10將被傳到Base類別,所以i = 10,而參數b=20則被指定給Derived的資料成員j。 int main() { Derived d(10,20); //i = 10, j = 20 return 0; //正常結束程式 }

11.5 繼承與包含 繼承(inherence)的關係是建立在子類別(衍生類別)繼承父類別(基礎類別)的成員,繼承後子類別可直接存取父類別的public與protected成員。 包含(composition)的關係則是建立在母類別(包含類別)包含子類別(被包含類別)的物件,也就是在母類別中建立子類別的物件,然後利用子類別物件存取子類別的public成員。

11.5.1 繼承類別 建立Employee基礎類別 Class Employee { ptotected: char name[20]; 11.5.1 繼承類別 建立Employee基礎類別 Class Employee { ptotected: char name[20]; int idEmp; public: void setdata() { cin >> name; cin >> idEmp; } void getdata() { cout << name << endl; cout << idEmp << endl; } };

11.5.1 繼承類別 (續) Manager類別以public型態繼承Employee類別 11.5.1 繼承類別 (續) Manager類別以public型態繼承Employee類別 class Manager: public Employee { protected: char titles[20]; double bonus; public: void setdata() Employee::setdata(); //呼叫Employee的setdata cin >> titles; cin >> bonus; } };

11.5.1 繼承類別 (續) 建立Manager物件m後,以m物件呼叫Manager類別的setdata與Employee類別的getdata函數。 int main() { Manager m; m.setdata(); m.getdata(); return 0; //正常結束程式 }

11.5.2 包含類別

11.5.2 包含類別 (續) 建立Point類別 class Point //定義Point類別 { int x, y; public: 11.5.2 包含類別 (續) 建立Point類別 class Point //定義Point類別 { int x, y; public: int getx() const { return x; } int gety() const { return y; };

11.5.2 包含類別 (續) Square類別成員中包含Point類別的物件comP class Square //定義Square類別 11.5.2 包含類別 (續) Square類別成員中包含Point類別的物件comP class Square //定義Square類別 { public: Point comP; //包含Point物件 int getarea() const { return comP.getx() * comP.gety(); //呼叫Point的函數成員 } };

11.5.2 包含類別 (續) 建立Education基礎類別 class Education { protected: 11.5.2 包含類別 (續) 建立Education基礎類別 class Education { protected: char degree[20]; public: void setdata() { cin >> degree; } void getdata() { cout << degree << endl; };

11.5.2 包含類別 (續) 建立Employee基礎類別 Class Employee { protected: 11.5.2 包含類別 (續) 建立Employee基礎類別 Class Employee { protected: char name[20]; public: void setdata() { cin >> name; } void getdata() { cout << name << endl; };

11.5.2 包含類別 (續) 定義Manager類別並包含Employee類別物件emp與Education類別物件edu 11.5.2 包含類別 (續) 定義Manager類別並包含Employee類別物件emp與Education類別物件edu class Manager { protected: char title[20]; Employee emp; //包含Employee類別物件 Education edu; //包含Education類別物件 public: void setdata() { emp.setdata(); edu.setdata(); cin >> title; } void getdata() { emp.getdata(); edu.getdata(); cout << title; } };

11.5.2 包含類別 (續) 建立Manager物件m後,以m物件呼叫Manager類別的setdata與Employee類別的getdata函數。 int main() { Manager m; m.setdata(); //呼叫Manager的setdata m.getdata(); //呼叫Manager的getdata return 0; //正常結束程式 }