運算子多載 Operator Overloading

Similar documents
第十章 虛擬函數 (Virtual Functions)

運算子多載 Operator Overloading

Strings

Strings

運算子多載 Operator Overloading

ebook55-13

Microsoft Word cppFinalSolution.doc

Microsoft Word - chap10.doc

The Embedded computing platform

untitled

untitled

提问袁小兵:

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


【主持人】:给大家介绍一下,这次的培训是我们画刊部的第三次培训,当然今天特别有幸请来著吊的摄影家李少白老师给我们讲课

NethersoleJO89(8).indd

文档 1

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

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

untitled

1.5招募说明书(草案)

第七讲 继承与多态

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

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Microsoft Word - 投影片ch11

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

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

Microsoft Word 箕æ−¥ï¼‹å®ı稿;

98年度即測即評學科測試與即測即評即發證技術士技能檢定簡章

机 密

國立中山大學學位論文典藏.PDF

Microsoft Word - ch04三校.doc

c_cpp

Chapter 9: Objects and Classes

untitled

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

软件工程文档编制

ebook39-5

Chapter12 Derived Classes

新版 明解C++入門編

FY.DOC

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

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

《大话设计模式》第一章

Microsoft Word - ACL chapter02-5ed.docx

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

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

chp6.ppt

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

(procedure-oriented)?? 2

Scott Effective C++ C++ C++ Roger Orr OR/2 ISO C++ Effective Modern C++ C++ C++ Scoot 42 Bart Vandewoestyne C++ C++ Scott Effective Modern C++ Damien

Microsoft Word - 01.DOC

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

Microsoft Word docx

投影片 1

<4D F736F F D B0D3B77EC3FEA7DEC3C0C476C1C9A5BFA6A1B8D5C3442DB57BA6A1B35DAD702DBEC7ACEC2E646F6378>

第3章.doc

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

Microsoft Word - 新1-12.doc

建模与图形思考

untitled

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

untitled

untitled

EJB-Programming-4-cn.doc

Microsoft Word - Sable User's Manual.doc

( 含 要 ) 1-2 用 或 雇 用, 抑 或 有 無 俸 給 文 職 或 武 職, 政 官 或 事 官 均 屬 之, 其 不 以 具 備 人 資 格 為 限, 因 此 屬 於 最 廣 義 之 念 四 廣 義 念 之 依 服 24 條 之 規 定 : 本 於 受 有 俸 給 之 文 武 職, 及

(Microsoft Word - \256g\275b\252\354\305\351\305\347.doc)

ebook14-4

obj-c_4.key

Microsoft PowerPoint - plan08.ppt

Microsoft PowerPoint - L17_Inheritance_v4.pptx

mvc

第二章 簡介類別

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

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

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

概述

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

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


说 : 荀 子 极 偏 驳, 只 一 句 性 恶, 大 本 已 失 5 朱 熹 说 : 荀 扬 不 惟 说 性 不 是, 从 头 到 底 皆 不 识 6 采 取 的 都 是 这 种 理 论 框 架 另 一 种 理 论 框 架 始 于 20 世 纪 前 期, 这 便 是 诸 子 学 研 究 的 框 架

用户大会 论文集2.2.doc

(Microsoft Word - Motion Program \270\305\264\272\276\363 \307\245\301\366 \271\327 \270\361\302\367.doc)

C35_RG_E.book

ebook35-2

第七章 繼承

皈依三寶的意義 一 為何要皈依三寶?

1.5招募说明书(草案)

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

untitled

ebook39-6

Microsoft Word - chap12.doc

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Chapter 9: Objects and Classes

untitled

gongGaoMingCheng

untitled

C 1

Transcription:

多型 Polymorphism 講師 : 洪安 1

多型 編譯時期多型 ( 靜態多型 ) function overloading 如何正確呼叫同名的函數? 利用參數個數與型態 operator overloading 其實同 function overloading 執行時期多型 ( 或動態多型 ) 如何正確呼叫不同物件的相同名稱的成員函數 利用繼承與多型 2

子類別與父類別物件間的指定 (assignment) class base { int x ; setx(int n) { x=n;} class derived: public base { int y ; setx(int n) { base::setx(3*n);} sety(int n) { y = n;} 3 int main() { base b ; derived d ; b = d ; // 可以嗎? Y b.setx(5) ; // 哪個 setx() B b.sety(10); //? X d = b ; //? X d.setx(5) ; //D d.sety(8); // D return 0; }

課堂練習 :4_assignment.cpp class base { int x ; void setx(int n) { x=n;} }; class derived: public base { int y ; void setx(int n) { base::setx(3*n);} void sety(int n) { y = n;} 結論 base Obj = derived Obj derived Obj = base Obj 4

衍生類別的指標 Case 1 int main() { base *pb ; base b; derived d ; pb = &b ; // Sure! pb->setx(5) ; } pb = &d ; // 可以嗎? Y pb->setx(5) ; // 指到哪個? B pb->sety(10); // X return 0; Case 2 int main() { derived *pd ; base b; derived d ; pd = &b ; //??? X pd->setx(5) ; //? D return 0; } pd = (derived *) &b 5

衍生類別的參考 (reference) Case 1 int main() { base b; derived d ; base &refb1 = b ; refb1.setx(5) ; // 哪個? B } base &refb2 = d ; // 可以嗎? Y refb2.setx(5) ; // 指到哪個? B refb2.sety(10); //X return 0; Case 2 int main() { base b; derived d ; derived &refd1 = b ; // 可以嗎? X refd1.setx(5) ; // 指到哪個? D return 0; } derived &refd1 = (derived &) b ; 6

課堂練習 4_PtrRef.cpp class base { int x ; void setx(int n) { x=n;} class derived: public base { int y ; void setx(int n) { base::setx(3*n);} void sety(int n) { y = n;} base *pb ; base b; derived d ; 7

多型與虛擬函數 (virtual function) 是否能呼叫到正確的 move() 與 stop(); class car { move() ; stop(); class Benz: public car { move() ; stop(); 甚麼是執行時期的多型? class Volvo: public car { move() ; stop(); class Civic: public car { move() ; stop(); int main() { Benz b; Volvo v; Civic c ; demo(b); demo(v); demo(c) ; return 0; } void demo(car& c) { c.move() ; c.stop() ;} 8

不使用虛擬函數 class car { void move() { cout << car move ;} class Benz: public car { void move() { cout << Benz move ;} class Volvo: public car { void move() { cout << Volvo move ;} void demo(car& c) { c.move() ; } int main() { Benz b ;Volvo v; demo(b); demo(v) ; return 0;} 實際 try! 輸出結果為何? 9

課堂練習 : 4_NoVirtual.cpp 實作類別 car, volvo, benz 實作成員函數 move 實作函數 demo 10

什麼是虛擬函數 (virtual function)? 是一種宣告在基底類別中的成員函數 提供執行時期多型的機制 使用 virtual 關鍵字 通常衍生類別會 override 它 11

使用虛擬函數 ( 配合 reference) class car { virtual void move() { cout << car move ;} class Benz: public car { void move() { cout << Benz move ;} class Volvo: public car { void move() { cout << Volvo move ;} void demo(car& c) { c.move() ; } void main() { Benz b ;Volvo v; demo(b); demo(v) ; } 實際 try! 輸出結果為何? 12

使用虛擬函數 ( 配合 pointer) class car { virtual void move() { cout << car move ;} class Benz: public car { void move() { cout << Benz move ;} class Volvo: public car { void move() { cout << Volvo move ;} void demo(car *pc) { pc->move() ; } void main() { Benz b ;Volvo v; demo(&b); demo(&v) ; } 實際 try! 輸出結果為何? 13

使用虛擬函數 ( 配合物件傳遞 ) class car { virtual void move() { cout << car move ;} class Benz: public car { void move() { cout << Benz move ;} class Volvo: public car { void move() { cout << Volvo move ;} void demo(car c) { c.move() ; } int main() { Benz b ;Volvo v; demo(b); demo(v) ; return 0; } 實際 try! 輸出結果為何? 14

不使用多型可以嗎? 多型 : 一個介面多種用法 void move(car& c) { c.move() ;.} 不多型 : void move(void *p, int type) { } 優點? 缺點? switch(type){ } case 1: ((Benz *)p)->move(); break ; case 2: ((Volvo *)p)->move(); break ; 15

範例討論 Stack 先進後出 Queue 先進先出 list head store(x); retrieve(); #1 #2 #n 如何利用 list 來模擬 ( 實作 ) stack 與 queue stack queue retrieve store #1 retrieve #1 #2 #n store 16 #n-1 #n

繼承示意圖 class list { virtual void store(int i) ; virtual int retrieve() ; class stack: public list { void store(int i) ; int retrieve() ; class queue: public list { void store(int i) ; int retrieve() ; 17

更多虛擬函數的細節 純粹虛擬函數 (pure virtual function) class printer { string filename ; void reset() { } virtual void print(int m)=0 ; } 抽象類別 (abstract class) 當類別至少含有一個純粹虛擬函數時 不能用來產生物件 e.g. printer p ; //Error 18

純粹虛擬函數的內容 純粹虛擬函數 (pure virtual function) class printer { string filename ; virtual void reset()=0 { filename= test.txt ; } virtual void print(int mode)=0 ; } 19

純粹虛擬函數的特性 衍生類別一定要 override 基底類別中所有的純粹虛擬函數 class printer {...}; class HPLaserJet6L: public printer { void reset() { 自己的版本 } void print(int mode) { 自己的版本 } }; 20

抽象類別的用途 ( 一 ) 設計共同的使用介面的類別 ( 衍生類別負責實作 ) class shape { string name ; virtual void draw(char b[][80])=0 ; // 不必有實作 virtual void clear()=0 ; // 不必有實作 }; class triangle: public shape { class circle: public shape { }; 21

抽象類別的用途 ( 二 ) 防止使用者產生不允許存在的物件 class shape { string name ; virtual void draw()=0 ; }; class triangle: public shape { class circle: public shape { }; int main() { shape s ; /* 這是啥米碗糕 */.. } 22