Strings



Similar documents
Strings

Microsoft Word - chap10.doc

extend

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Microsoft PowerPoint - L17_Inheritance_v4.pptx

untitled

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

C/C++程序设计 - 字符串与格式化输入/输出

第七讲 继承与多态

(procedure-oriented)?? 2

FY.DOC

Microsoft Word - ch04三校.doc

Chapter 9: Objects and Classes

新版 明解C++入門編

untitled

Microsoft Word cppFinalSolution.doc

Chapter12 Derived Classes

c_cpp

很 活 潑, 和 氣 的 像 一 家 人 在 張 主 任 慈 祥 的 臉 上, 常 帶 著 微 笑, 在 手 術 或 特 別 檢 查 時, 跟 隨 他 身 邊 會 給 我 扼 要 性 的 解 釋, 可 惜 他 英 年 早 逝, 我 常 念 著 他 陳 振 武 教 授, 沉 默 寡 言, 在 學 術

Microsoft Word - 補陽食物.doc

untitled

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

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

软件工程文档编制

口 的 70% 连 南 县 的 瑶 族. 有 排 瑶 过 山 瑶 排 瑶 6 万 多 人 住 在 三 排 南 岗 i 雨 水 大 麦 山 大 坪 香 坪 盘 石 金 坑 8 个 乡 镇. 形 成 了 占 全 县 面 积 80% 的 聚 居 地 << 连 州 志 } 卷 八 排 瑶 志 曰 在 连 者

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

《大话设计模式》第一章

新・解きながら学ぶJava

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

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

提问袁小兵:

運算子多載 Operator Overloading

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

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


Microsoft Word - 第3章.doc

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

紫 星 百 宝 书 腿 脚 也 不 听 使 唤, 多 走 几 步 就 打 颤 最 闹 心 的 是 尿 多, 连 出 门 都 是 负 担 很 多 人 开 始 重 视 了, 可 的 方 法 却 不 知 晓 ; 头 痛 医 头, 脚 痛 医 脚 钱 没 少 花, 药 吃 了 不 少 折 腾 了 许 久,

Microsoft Word - 第7章 类与对象.docx

Microsoft Word - 01.DOC

Adobe® Flash® 的 Adobe® ActionScript® 3.0 程式設計

第3章.doc

untitled

C 1

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

untitled

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

3. 某 县 卫 生 局 对 某 企 业 作 出 行 政 处 罚 决 定, 该 企 业 不 服 申 请 复 议, 下 列 有 关 复 议 的 叙 述 正 确 的 是 ( ) A. 只 能 向 县 卫 生 局 所 在 地 的 县 政 府 提 出 复 议 请 求 B. 只 能 向 县 卫 生 局 的 上

2088

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

Microsoft Word - chap13.doc

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

Factory Methods

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

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

目 录 一 重 要 提 示... 3 二 公 司 主 要 财 务 数 据 和 股 东 变 化... 3 三 重 要 事 项... 6 四 附 录 / 20

安全教育案例


2048.doc

<4D F736F F D20B8F2A6B1BEA4B1D3BEC7BE69A5CDB4BCBC7AA4A7B6C0ABD2A4BAB8672E646F63>

「行政院及所屬各機關出國報告綜合處理要點」

第五讲


<4D F736F F D20B0B2C8ABD6AACAB6CAD6B2E12E727466>

* 春 中 喜 王 九 相 寻 ( 晚 春 )* 二 月 湖 水 清, 家 家 春 鸟 鸣 林 花 扫 更 落, 径 草 踏 还 生 酒 伴 来 相 命, 开 尊 共 解 酲 当 杯 已 入 手, 歌 妓 莫 停 声 * 梅 道 士 水 亭 * 傲 吏 非 凡 吏, 名 流 即 道 流 隐 居 不

Microsoft PowerPoint - ³Ò´f¿³

石 狮 市 小 学 语 文 阅 读 与 习 作 教 学 征 文 评 选 优 秀 作 品 汇 编 耕 耘 ( 第 17 辑 ) 目 录 前 言 小 学 教 研 室 [4] 阅 读 教 学 把 握 内 在 联 系 提 升 理 性 认 识 祥 芝 中 心 校 黄 军 荣 [5] 求 真 务 实 有 效 教

泪 状 物 雨 水 酒 血 自 来 水 恩 泽 弱 水 三 千 一 股 股 淌 进 沙 漏 回 到 黑 暗 的 胃 脘 昨 夜 墨 迹 未 干 黎 明 的 海 涂 刚 刚 镀 过 银 谁 在 对 镜 梳 妆 可 以 踩 吗? 探 一 只 脚 试 试 海 洋 局 的 种 族 歧 视 那 边 是 五 星

' I 6

6寸PDF生成工具

艾宁《问中医几度秋凉》

不 管 有 多 忙, 请 您 抽 空 把 这 个 文 件 看 完!! 七 十 年 代 送 礼 送 点 心 八 十 年 代 送 礼 送 保 健 品 九 十 年 代 送 礼 送 鲜 花 二 十 一 世 纪, 送 礼 送 什 么 呢? 二 十 一 世

授权发布:中华人民共和国国民经济和社会发展第十二个五年规划纲要

卫生部托儿所、幼儿园卫生保健制度

附:

修習止觀坐禪法要

馬太福音 劉梅蕾師母

<4D F736F F D20D6D0CEF7D2BDBDE1BACFCDE2BFC6D1A720D6D0CEF7D2BDBDE1BACFB9C7C9CBBFC6D1A72E646F63>

Microsoft Word - 煽.doc

Microsoft Word - 文档 2


校旗及学风、校风、教风

证券代码:002153

史前陶器,海岱為魁

投稿類別:觀光餐旅類

平 安 也 不 是 用 金 钱 可 以 买 到 的 我 们 的 俗 语 说," 平 安 即 是 福 " 人 们 都 喜 爱 平 安, 寻 求 平 安, 但 有 几 个 人 真 得 着 了 平 安 呢? 有 几 个 人 家 庭 中 洽 洽 融 融, 没 有 争 吵, 没 有 口 角, 父 慈 子 孝,

Microsoft Word - 小論文 正.doc

中国科学院半导体研究所文件

莫 奈 日 出 印 象 睡 莲 蒋 芷 若 画 家 简 介 克 劳 德 莫 奈, 法 国 画 家, 被 誉 为 印 象 派 之 父, 是 印 象 派 代 表 人 物 和 创 始 人 之 一 莫 奈 是 法 国 最 重 要 的 画 家 之 一, 印 象 派 的 理 论 和 实 践 大 部 分 都 有


存 货 的 可 变 现 净 值 是 指 在 企 业 日 常 活 动 中 以 存 货 的 减 去 以 及 后 的 金 额 二 单 项 选 择 题 甲 公 司 为 增 值 税 一 般 纳 税 人 其 于 年 月 日 购 入 原 材 料 一 批 增 值 税 专 用 发 票 上 注 明 的 价 款 为 元

卷八 隐痛 卷九 美丽的时刻 后记 一条河流的梦 时光九篇 卷一 诗的成因 卷二 长路 卷三 悬崖菊 卷四 雾起时 卷五 时光的复仇 卷六 良夜 卷七 子夜变歌 卷八 在黑暗的河流上 卷九 夏夜的传说 后记 愿望 在那遥远的地方 序 在那遥远的地方 卷一 出塞曲 卷二 漂泊的湖 卷三 飘 蓬 卷四

2010年普通高等学校招生统一考试(福建卷)

附:

2 秦汉文学地理与文人分布 晋 还如楚 令尹子木 与 之 语 问 晋 故 焉 且 曰 晋 大 夫 与 楚 孰 贤 对 曰 晋 卿 不 如 楚 其 大 夫 则 贤 皆 卿 材 也 如 杞 梓 皮 革 自 楚 往 也 虽 楚有材 晋实用之 子木曰 夫 独 无 族 姻 乎 对 曰 虽 有 而 用 楚 材

Microsoft Word - 30年.doc

20 3 昆 明 : 西 山 区 红 色 引 擎 推 动 社 会 组 织 取 得 新 发 展 2 4 西 山 区 委 统 战 部 官 渡 区 委 统 战 部 25 2 昆 明 : 西 山 区 委 统 战 部 三 创 新 一 拓 展 抓 实 两 学 一 做 学 习 教 育 昆

(Microsoft Word - \253??\273??43?.doc)

中央一号文件

2011年党风廉政信息(第二十三辑)

Transcription:

Polymorphism and Virtual Functions Cheng-Chin Chiang

Virtual Function Basics 多 型 (Polymorphism) 賦 予 一 個 函 數 多 種 意 涵, 存 在 於 同 一 類 別 之 內 祖 先 類 別 與 後 代 類 別 間 物 件 導 向 程 式 設 計 基 本 原 理 虛 擬 函 數 (Virtual Function) 一 種 可 以 動 態 連 結 (Dynamic Binding) 或 遲 連 結 (Late Binding) 的 函 數 不 是 由 編 譯 器 來 決 定 多 型 的 函 數 中 哪 一 個 版 本 的 函 數 被 呼 叫 執 行 時 才 決 定 被 呼 叫 的 版 本 決 定 原 則 : 根 據 執 行 呼 叫 的 類 別 實 體 來 呼 叫 該 實 體 所 屬 類 別 的 函 數 版 本

Example with no Virtual Functions class C public: string tostring() return "class C"; ; class B: public C string tostring() return "class B"; ; class A: public B string tostring() return "class A"; ; void displayobject(c x) cout << x.tostring().data() << endl; int main() displayobject(a()); displayobject(b()); displayobject(c()); return 0; 結 果 : class C class C class C

Example with Virtual Functions class C public: virtual string tostring() return "class C"; ; class B: public C string tostring() return "class B"; ; class A: public B string tostring() return "class A"; ; void displayobject(c *p) cout << p->tostring().data() << endl; int main() A a = A(); B b = B(); C c = C(); displayobject(&a); displayobject(&b); displayobject(&c); return 0; 結 果 : class A class B class C

Why using virtual functions? 原 因 如 前 例, 當 我 們 在 設 計 class C 時, 可 能 還 不 知 道 後 面 的 設 計 師 會 根 據 class C 訂 出 那 些 衍 生 類 別 這 些 衍 生 類 別 中 可 能 會 定 義 各 自 不 同 的 tostring() 函 數, 而 class C 中 並 無 法 得 知 有 何 不 同 為 能 透 過 基 礎 類 別 物 件 來 執 行 基 礎 類 別 和 衍 生 類 別 間 的 多 型 呼 叫 ( 允 許 執 行 時 動 態 決 定 呼 叫 適 當 的 版 本 ), 可 以 在 基 礎 類 別 (class C) 中 將 tostring() 宣 告 為 虛 擬 函 數 注 意 須 透 過 物 件 指 標 或 物 件 參 考 來 呼 叫 避 免 割 除 問 題 (Slicing Problem) 基 礎 類 別 宣 告 為 virtual 的 函 數, 在 其 所 有 衍 生 類 別 中 也 自 動 成 為 virtual 函 數, 不 需 要 再 特 別 宣 告 其 為 virtual

Overriding vs. Redefining in Derived Classes 在 衍 生 類 別 中 重 新 設 計 虛 擬 函 數 稱 為 overriding 重 新 設 計 非 虛 擬 函 數 稱 為 redefining

Pros and Cons of Virtual Functions 優 點 (Pros) 多 型 呼 叫 的 彈 性 缺 點 (Cons) 執 行 時 效 率 較 低 使 用 較 多 記 憶 體 動 態 連 結 需 要 而 外 執 行 動 作, 較 耗 時 間

Inner Workings of Virtual Functions 虛 擬 函 數 表 (Virtual function table) 由 編 譯 器 產 生 表 中 含 有 知 道 各 個 虛 擬 函 數 的 指 標 指 到 函 數 程 式 碼 所 在 的 位 置 根 據 類 別 所 產 生 的 實 體 物 件 中 也 須 包 含 指 到 虛 擬 函 數 表 的 指 標

Pure Virtual Functions 類 別 繼 承 原 則 提 醒 基 礎 類 別 的 成 員 較 具 籠 統 性 與 共 通 性 ( 所 以 基 礎 類 別 較 為 抽 象 ) 基 礎 類 別 中 的 函 數 被 設 計 來 執 行 較 共 通 的 動 作 在 基 礎 類 別 中 的 虛 擬 函 數 可 能 因 為 衍 生 類 別 太 過 多 元, 導 致 在 此 虛 擬 函 數 中 完 全 沒 有 共 通 性 的 動 作 需 要 執 行 此 虛 擬 函 數 變 成 是 一 個 有 名 無 實 的 純 虛 擬 函 數 (Pure Virtual Function) 此 此 純 虛 擬 函 數 的 存 在 目 的 僅 為 了 讓 衍 生 類 別 繼 承 一 個 共 通 名 稱 的 函 數, 然 後 再 於 各 衍 生 類 別 中 予 以 按 照 各 自 需 求 來 redefine 宣 告 純 虛 擬 函 數 的 語 法 virtual 回 傳 資 料 型 態 函 數 名 稱 ( 參 數 列 )= 0;

Example of Pure Virtual Function class Triangle: public Figure.. void draw();.. ; class Figure.. virtual void draw() = 0;.. ; class Circle : public Figure.. void draw();.. ; class Rectangle : public Figure.. void draw();.. ;

Abstract Base Classes 抽 象 類 別 : 擁 有 一 個 或 多 個 純 虛 擬 函 數 的 類 別 稱 為 抽 象 類 別 只 能 當 基 礎 類 別 使 用 不 可 利 用 抽 象 類 別 產 生 實 體 物 件 ( 因 為 有 成 員 尚 未 有 完 整 的 定 義 ) 一 個 衍 生 類 別 繼 承 自 抽 象 類 別 時 如 果 未 能 完 成 所 有 純 虛 擬 函 數 的 定 義, 則 此 衍 生 類 別 也 仍 然 是 一 個 抽 象 類 別 俄

例 題 : 抽 象 幾 何 類 別 class GeometricObject protected: GeometricObject(); GeometricObject(string color, bool filled); public: string getcolor(); void setcolor(string color); bool isfilled(); void setfilled(bool filled); string tostring(); virtual double getarea() = 0; virtual double getperimeter() = 0; private: string color; bool filled; ; class Rectangle: public GeometricObject public: Rectangle(); Rectangle(double width, double height); Rectangle(double width, double height, string color, bool filled); double getwidth(); void setwidth(double); double getheight(); void setheight(double); double getarea(); double getperimeter(); private: double width; double height;

例 題 : 抽 象 幾 何 類 別 class Circle: public GeometricObject public: Circle(); Circle(double); Circle(double radius, string color, bool filled); double getradius(); void setradius(double); double getarea(); double getperimeter(); double getdiameter(); private: double radius; ;

Assignment between Base and Derived Classes 基 礎 類 別 與 衍 生 類 別 間 的 指 定 (assignment) 基 礎 類 別 物 件 = 衍 生 類 別 物 件 OK 衍 生 類 別 物 件 = 基 礎 類 別 物 件 Not OK class Pet public: ; string name; virtual void print() const; Dog vdog; Pet vpet; vdog.name = Tiny ; vdog.breed = Great Dane ; vpet = vdog; class Dog : public Pet public: string breed; virtual void print() const; ; OK, 但 會 發 生 割 除 問 題 (Slicing Problem)

Slicing Problem 將 衍 生 類 別 指 定 給 基 礎 類 別 後, 導 致 部 份 成 員 遺 失 ( 無 效 ) 例 如 前 例 :vpet = vdog 指 定 之 後,vdog 中 的 breed 欄 位 變 為 無 效 所 以 cout << vpet.breed; 錯 誤!!!

Slicing Problem Fix 利 用 指 標 可 以 避 免 割 除 問 題 但 是 Pet *ppet; Dog *pdog; pdog = new Dog; pdog->name = "Tiny"; pdog->breed = "Great Dane"; ppet = pdog; cout << ppet->breed; 仍 然 錯 誤! 因 為 Pet 類 別 並 未 定 義 breed 欄 位! 解 決 方 法 : 利 用 虛 擬 函 數 來 輸 出 breed 欄 位, 因 為 虛 擬 函 數 有 根 據 實 體 物 件 的 所 屬 類 別 來 動 態 呼 叫 多 型 功 能

class Pet public: string name; virtual void print() const; ; class Dog : public Pet public: string breed; virtual void print() const; ; void Pet::print() const cout << this->name << endl; void Dog::print() const cout << this->name << endl; cout << this->breed << endl; Pet *ppet; Dog *pdog; pdog = new Dog; pdog->name = "Tiny"; pdog->breed = "Great Dane"; ppet = pdog; ppet->print(); // 呼 叫 Dog 的 print(), 因 為 ppet 指 到 一 個 dog 實 體 物 件

Virtual Destructors Base *pbase = new Derived; delete pbase; // 問 題 : 呼 叫 Base 的 解 構 子 還 是 Derived 的 解 構 子? ANS:Base 的 解 構 子 修 正 方 法 : 將 Base 的 解 構 子 宣 告 為 virtual

Casting 可 否 使 用 下 面 的 靜 態 冠 型? Pet vpet; Dog vdog; vdog = static_cast<dog>(vpet); ILLEGAL! Downcasting vpet = static_cast<pet>(vdog); Upcasting 是 被 允 許 的 把 後 代 類 別 物 件 轉 為 祖 先 類 別 物 件 LEGAL! Upcasting

Downcasting 把 祖 先 類 別 物 件 轉 型 為 後 代 類 別 物 件 後 代 類 別 多 出 來 的 資 料 成 員 須 備 妥 Downcasting 是 有 風 險 的! 可 以 利 用 動 態 冠 型 來 強 迫 執 行 Pet *ppet; ppet = new Dog; Dog *pdog = dynamic_cast<dog*>(ppet); Downcasting 很 少 被 使 用, 因 為 必 須 備 妥 所 有 在 後 代 類 別 中 新 增 屬 性 成 員 所 有 成 員 函 數 必 須 宣 告 為 虛 擬 函 數

例 題 : A function for displaying a geometric object void displaygeometricobject(geometricobject &object) cout << "The area is " << object.getarea() << endl; cout << "The perimeter is " << object.getperimeter() << endl; GeometricObject *p = &object; Circle *p1 = dynamic_cast<circle*>(p); Rectangle *p2 = dynamic_cast<rectangle*>(p); if (p1!= 0) cout << "The radius is " << p1->getradius() << endl; cout << "The diameter is " << p1->getdiameter() << endl; if (p2!= 0) cout << "The width is " << p2->getwidth() << endl; cout << "The height is " << p2->getheight() << endl; int main() Circle circle(5); Rectangle rectangle(5, 3); cout << "Circle info: " << endl; displaygeometricobject(circle); cout << "\nrectangle info: " << endl; displaygeometricobject(rectangle); return 0; Circle info: The area is 78.5397 The perimeter is 31.4159 The radius is 5 The diameter is 10 Rectangle info: The area is 15 The perimeter is 16 The width is 5 The height is 3

typeid operator 取 得 物 件 類 別 的 相 關 資 訊 傳 回 一 個 type_info 類 別 的 物 件 (#include typeinfo.h ) class abc int a; int b; ; int main() abc x; cout << typeid(x).name() << endl; 結 果 : class abc type_info info; info = typeid(x); cout << info.name(); 錯 誤! type_info 的 建 構 子 和 指 定 運 算 子 都 是 private