Virtual Function Jing(井民全).

Slides:



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

项目7 面向对象高级.
第一章 面向对象程序设计.
第6章 多态性与虚函数.
11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20
C++ Object Model 台大資工多媒體實驗室 林昂賢.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
File Access 井民全製作.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
簡易C++除錯技巧 長庚大學機械系
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Classes Lecturer: 曾學文.
Scope & Lifetime 前言 Local Scope Global Functions & Objects
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
Object-Oriented Programming:
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C語言簡介 日期 : 2018/12/2.
程序设计期末复习 黎金宁
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
類別(class) 類別class與物件object.
Object-Oriented Programming: Polymorphism
C#面向对象程序设计 $7 继承和多态性.
第四章 小技巧.
第七章 檔案處理.
Java 程式設計 講師:FrankLin.
软件学院 张 慧 清华大学软件学院.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Topic Introduction—RMI
第一單元 建立java 程式.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
Ch20. 計算器 (Mac 版本).
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
Classes (2) Lecture 7.
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第12讲 多继承与虚基类 多继承 虚基类.
潘爱民 C++ Overview 潘爱民
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
如何使用Gene Ontology 網址:
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Inheritance -II.
第三章 数据抽象.
C qsort.
Object-Oriented Programming in C++ 第二章 类和对象
繼承的優點 程式碼再使用 (code reuse) 抽象概念再使用 類別階層化 澄清物件間的關係.
面向对象技术 练习 ffh.
第九章 物件導向-進階.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第一讲 面向对象方法学与信息系统建模.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
方法(Method) 函數.
Presentation transcript:

Virtual Function Jing(井民全)

Virtual Function基本概念 基礎類別定義基本的功能 衍生類別 繼承了基礎類別 定義特殊的功能 class Animal weight eat() SetWeight() 動物的基本功能 class Cat eat() SetWeight() Sleep() 貓的功能

Virtual Function基本概念 class Animal class Cat class Animal { public: int weight; void eat(); void setWeight(); }; class Animal weight eat() SetWeight() 動物的基本功能 class Cat:public Animal { public: void eat(); void setWeight(); void Sleep(); }; class Cat eat() SetWeight() Sleep() 貓的功能

Virtual Function基本概念 貓有貓的吃飯方式! class Animal Cat *Mycat=new Cat(); weight eat() SetWeight() 動物的基本功能 Cat *Mycat=new Cat(); Mycat->eat(); class Cat eat() SetWeight() Sleep() 貓的功能

Virtual Function基本概念 ? 因為貓是動物的一種, 所以我們可以用動物reference貓 class Animal Polymorphism(多形) class Animal weight eat() SetWeight() class Cat Sleep() 動物的基本功能 貓的功能 Cat *Mycat=new Cat(); Animal *obj=Mycat; obj->eat(); ?

Virtual Function基本概念 呼叫貓的eat(): 加入 virtual 關鍵字 class Animal class Cat weight eat() virtual SetWeight() class Cat SetWeight() Sleep() 動物的基本功能 貓的功能 Cat *Mycat=new Cat(); Animal *obj=Mycat; obj->eat(); virtual 範例程式: virtualConcept1.cpp

只要是Animal型別就可以操作 可以視為 Animal 型態操作,又可呼叫自己特別function. 泛型處理 Animal 存取未知物件 的相對應的 function 可以視為 Animal 型態操作,又可呼叫自己特別function. 泛型處理

介面的概念 建立一個功能 只接受某種型態的物件 某些電器需要的是三孔插座,某些電器需要的是220V的電壓 電力公司服務 電器1 電器2 我是三孔插座 我是220V 插頭必須是三孔 電壓一定要符合 220V 電器1 電器2

介面的概念 接受電力公司提供服務的條件 擁有三孔插座 可接受 220V 電壓 若想接受服務, 則電器(物件)必須符合條件!! 3孔介面

class TV:public Plug3,public Volate220{ public: void input3(){ } 3孔介面 120V電視機 220V介面 class Plug3{ virtual public void Input3() =0; } class Volate220V{ virtual public void Input220V() =0; class TV:public Plug3,public Volate220{ public: void input3(){ } void input220V(){ }; 把3孔轉2孔的轉換程式放在這 把220轉120V電壓轉換程式放在這

虛擬解構式 範例程式: VirtualDestructor.dsw class Sortable sp=pp; class Person 假設 Person 繼承 Sortable Sortable *sp; Person *pp=new Person("Frank","frank@icce.rug.nl","363 3688"); // 使用基礎類別指標 reference Person sp=pp;     請問下面的程式碼,會呼叫 Sortable 還是 Person 的解構子? delete sp; <解答> 若不加入 virtual 在sp的解構式中,則 delete sp 會呼叫 sp的解構子,而非 Person的解構子

虛擬解構式 所以應該在基礎類別 Sortable 的解構式中加入 virtual. class Sortable{ // < 其他程式碼 > virtual ~Sortable( ){ } 如此 delete sp; 才會呼叫正確的 Person的解構式

Delete Derived 會呼叫 Derived虛擬解構式, 但是程式會繼續呼叫 Base 的解構式嗎? 問題: Delete Derived 會呼叫 Derived虛擬解構式, 但是程式會繼續呼叫 Base 的解構式嗎? 我們知道在 Sortable 的解構子加上 virtual後, 執行delete sp; 會呼叫目前指向物件的解構子 Sortable *sp; Person *pp=new Person("Frank","frank@icce.rug.nl","363 3688"); // 使用基礎類別指標 reference Person sp=pp;     delete sp; class Sortable class Person 2. 執行Sortable的解構子 1. 執行Person 的解構子 解構的順序為 ~Derived() -> ~Base()

多重繼承下的虛擬函式 一個衍生類別可能繼承多個基礎類別 注意: 這裡重複繼承了 Base 問題: void main( ) { 考慮下面的 code class Base{    public:        void setfield(int val){ field = val; }        int getfield() const   { return (field); }    private:            int  field;  }; void main( ) { Derived obj; obj.getfield(); } 問題: 注意: 這裡重複繼承了 Base class Derived: public Base, public Base{  }; 呼叫哪一個 Base 的 getfield( )

多重繼承下的虛擬函式 多重繼承推導圖與內部結構圖 重複繼承了 Vechicle 佔用了兩份空間 程式很大的時候,則會亦有類似狀況 (因為基礎類別可能不是你寫的) 多重繼承推導圖與內部結構圖 重複繼承了 Vechicle 佔用了兩份空間

解決方法: 虛擬繼承 Virtual Base classes 完整程式範例: VirtualDerived.dsw 解決方法: 虛擬繼承 Virtual Base classes 對於一個 AirAuto, 我們只須要一個 weight. class Land: virtual public Vehicle{ ... }; class Air: virtual public Vehicle{ ... }; 虛擬繼承與虛擬函數不同的地方在於 虛擬繼承完全可以在 compile-time 解析

執行時期的形態辨別 一個基礎類別的指標,可能指的是衍生類別. 那麼我們在執行的時候, 要如何知道這個基礎類別指標到底是指向哪一個物件? class 動物 動物 *p=new 貓; class 貓 重要觀念: 貓是動物的一種. 所以我們可以用動物存取貓. Why? 使得任何的動物種類的物件 都可以用 p 存取. 這就是抽象化,

C++ 的解決方案 typeid 指出目前的指標到底是那一種型態. (傳回字串告訴你) dynamic_cast 運算子來將一個指標轉換成 基礎類別型態 或 衍生類別型態. 在VC中,必須設定才允許使用 dynamic_cast. [project]->[setting...]->[C++]->[C++ Language]: Enable Run-Time Type Information(RTTI)

typeid 範例1 必須先 #include <typeinfo> 在class 中至少要有一個 virtual function 考慮下面的code #include <typeinfo> void main(){ cout << typeid(12).name() << endl; cout << typeid(3.14).name() << endl; } 會印出 int 會印出 double 看 typeid範例2.doc

dynamic_cast 範例 See dynamic_cast.doc