C++ Object Model 台大資工多媒體實驗室 林昂賢.

Slides:



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

第一章 資料結構導論 1-1 資料結構簡介 1-2 認識程式設計 1-3 演算法效能分析 1-4 物件導向程式設計與Java.
四資二甲 第三週作業 物件導向程式設計.
第一章 面向对象程序设计.
程設一.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第7单元 面向过程编程—— 继承与多态.
Virtual Function Jing(井民全).
第八章 类和对象.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
程設一.
Java簡介.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Classes Lecturer: 曾學文.
第16章 VB.NET物件導向與.NET Framework
Classes: A Deeper Look, Part 1
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Java软件设计基础 5. 继承与多态.
C語言簡介 日期 : 2018/12/2.
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
C++ 與 物件導向 程式設計概念簡介 魏天君 2018/12/3.
類別(class) 類別class與物件object.
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
SPOTO TM JAVA课程 JAVA中的OO语法
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第九單元 Classes and data abstraction I
第七章 檔案處理.
Java 程式設計 講師:FrankLin.
软件学院 张 慧 清华大学软件学院.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
Ch02-基礎語法.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Topic Introduction—RMI
第一單元 建立java 程式.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
Struct結構 迴圈
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
Classes (2) Lecture 7.
第 19 章 XML記憶體執行模式.
潘爱民 C++ Overview 潘爱民
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++复习2----类与对象.
保留字與識別字.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Inheritance -II.
第三章 数据抽象.
C qsort.
Object-Oriented Programming in C++ 第二章 类和对象
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
Review 1~3.
第九章 物件導向-進階.
陣列與結構.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

C++ Object Model 台大資工多媒體實驗室 林昂賢

Preview What is C++ object model ? Class and object data member access single object layout Inheritance object layout polymorphism virtual

C++ object model C++ compiler底層的實做機制,用來實做各物件的運作模型,使之能具備C++諸多物件導向的性質。

Class Class是一種abstract data type. 在class宣告時,包含兩種成員: 1.data member :描述class object之屬性。 2.member function:描述class object之行為。 利用class這樣的abstract data type,我們可以定義出(造出)許多的這種 type 的instantiation叫做object。

Static Data Member 屬於class層級的資料,所有object共享一份static data member。 存取static member不需要透過任何的object,在無任何object時已透過member selection operators 來存取。 所有的存取都會被compiler轉化為extern實體的直接參考動作 Ex. CPoint3D::size = 300;

&(this) + (data member offset) Nonstatic Data Member 對於nonstatic data member的存取,實際上是透過implicit的this指標來完成。 存取會轉換成 &(this) + (data member offset) 由於offset在compiler time就可算出,其效率等於存取一個C struct member.

Single Object layout 一個object的實體之內只含class 之 nonstatic data member及某些輔助機制(vptr)。 Class member functions 獨立於object實體之外是獨一無二的一份函示實體(即多個object共享相同的函示實體。) 同一個access section的data members排列順序根據其宣告順序而定。 Access section的排列順序無強制規定。

Single Object layout (cont. 2) Class CPoint3d{ public: //….. Private: float x; static int size = 250; int y; void draw(); static int point- count(); private: char z; }; CPoint3d object x y z

Inheritance 繼承之於Nonstatic data members,是指base object members存在在derived object 中。 繼承之於Member functions,是指繼承了對base class’s member function的呼叫權利。 繼承之於Static data member,是指繼承了對bass class static data member的存取權利。

物件模型在繼承下 Layout的原則 C++保證,『出現在derived class中的bass class subobject有其完整之原樣性』。 Derived class layout = [ direct bass class ]s + [ 自己新增的data member (nonstatic data or vptr) ]

單一繼承的物件模型 單一繼承:指每一個class的direct bass class只能有一個,繼承的深度沒有限制。 float x; Class CPoint2d{ public : ….. protected : float x; float y; } oPt2d ; Class CPoint3d : public CPoint2d { public: … protected: float z; }oPt3d ; oPt3d float x; float y; float z; float x; float y; oPt2d

多重繼承的物件模型 多重繼承:指每一各class有兩個以上的direct base class,繼承的深度沒有限制。 float x; Class CPoint3dV: public CPoint2d ,public CVertex { public: … protected: float z; }oPt3dV ; float x; float y; Class CVertex{ Vertex *next; } oV; * next; oV * next; float z; oPt3dV

虛擬繼承 Shared subobject 繼承的機制。 多重繼承與虛擬多重繼承的比較: ios ios ios istream ostream istream ostream iostream iostream 多重繼承 虛擬多重繼承

虛擬繼承的物件模型(1) 下面是Cvertex3d虛擬繼承的架構: Class Point2d{ public : … protected: float x; float y; }; Class Vertex: public virtual Point2d{ public : … protected : vertex *next; }; Class Point3d: public virtual Point2d{ public : … protected : float z; }; Class Vertex3d: public virtual Vertex, public Point3d { public : … protected : float z; };

虛擬繼承的物件模型(2) Vptr_Point2d float x float y vptr_Vertex vpbassPoint2d Vertex *next Vertex oV Vptr_Point2d float x float y float z vpbassPoint2d vptr_point3d vptr_Vertex Vertex *next Float mumble Vertex3d oV3d Vptr_Point2d float x float y Point oPt2d Vptr_Point2d float x float y float z vpbassPoint2d vptr_point3d Point3d oPt3d

Polymorphism(1) 多型:以同一指標指向不同型別的物件。 群:一群“同型”但不全然相同的個體。Ex.一群大學生。 多型抽象目的:利用“群”的觀念,實現general演算法,並保有“個體”間的差異。 不同的derived class object彼此之間有差異,但屬於相同的bass class“群” 。 多型實做方式:bass point代表群,供general演算法來使用,bass point可指向向其derived class object保有個體差異。

Polymorphism(2) Ex. Bass class 魚, drive class 大肚魚,金魚,鯊魚 魚的point可以指向大肚魚、金魚、鯊魚魚的object。利用演算法:『由第一隻魚到最後一隻魚,魚開始游泳』可使所有的魚都開始游泳,但不同類的魚會依照自己的方式來游。 演算法簡潔,且保持個體之間的特性。 演算法設計者不需瞭解物件的如何實做。

C++如何支援多型 經由隱含轉型動作,允許derived class object轉化給base type point來指。 Object保有type-info。 Dynamic_cast可對Object point做型別轉換的安全檢查。

Unnatural polymorphism 當derive object assign 給bass pointer時,需暗含this point位移調整時,稱unnatural polymorphism。 暗含的位移調整工作由complier偷偷插入程式之中。 Ex. Vertext *pVertex = new Vertext3d; this pointer float z vpbassPoint2d vptr_point3d vptr_Vertex Vertex *next (offset) *pVertex Vertex3d Vertex * object

Virtual function Ex. Point2d * pPoint = new Vertex3d; pPoint->draw(); 當你希望draw()的呼叫是根據pPoint所指的物件而不是pPoint的型別時,draw()必須是virtual function。 Virtual function :使當利用指標來呼叫函式時,呼叫的函式實體是根據指標所指的物件的型別來決定,而不是根據指標的型別來決定。

Virtual function in Object model 每個object內有一個vptr指標,指向virtual function table。 每一個class有一個virtual function table(供object之vptr所指)內含class之中有作用的virtual function的address。 Virtual function table 的index 0 存放的是type-info用以支援runtime type identification (RTTI)。

Virtual table for point C++物件模型 兩種data member : static/nonstatic data; 三種member function: static/nonstatic/virtual function; Class Point{ public: point(float xtal); virtual ~Point(); float x() const; static int PointCount(); protected : virtual void show(); float x; static int point-count; }; Virtual table for point point-count PointCount() point(float) x() show() ~point() Type_info * vptr ; float x;