• 沒有找到結果。

c++ object model

N/A
N/A
Protected

Academic year: 2021

Share "c++ object model"

Copied!
22
0
0

加載中.... (立即查看全文)

全文

(1)

C++ Object Model

台大資工多媒體實驗室 林昂賢

(2)

Preview

• What is C++ object model ? • Class and object

• data member access • single object layout

• Inheritance object layout • polymorphism

(3)

C++ object model

• C++ compiler 底層的實做機制,用來實 做各物件的運作模型,使之能具備 C++ 諸多物件導向的性質。 • 物件模型底層的實做機制並未標準化, 各家 compiler 作法不一。 • 但解答許多問題必須根源與我們對 C++ object model 的瞭解。

(4)

Class

• Class 是一種 abstract data type.

在 class 宣告時,包含兩種成員:

– 1.data member :描述 class object 之屬性。 – 2.member function :描述 class object 之行為

• 利用 class 這樣的 abstract data type ,我們 可以定義出 ( 造出)許多的這種 type 的

(5)

Static Data Member

• 屬於 class 層級的資料,所有 object 共享

一份 static data member 。

• 存取 static member 不需要透過任何的 object ,在無任何 object 時已透過

member selection operators 來存取。

• 所有的存取都會被 compiler 轉化為 extern 實體的直接參考動作

(6)

Nonstatic Data Member

• 對於 nonstatic data member 的存取,實際

上是透過 implicit 的 this 指標來完成。

• 存取會轉換成

&(this) + (data member offset)

•由於 offset 在 compiler time 就可算出,

(7)

Single Object layout

• 一個 object 的實體之內只含 class 之 nonstatic data member 及某些輔助機制 (vptr) 。

• Class member functions 獨立於 object 實體之外 是獨一無二的一份函示實體(即多個 object 共 享相同的函示實體。)

• 同一個 access section 的 data members 排列順序 根據其宣告順序而定。

(8)

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

(9)

Inheritance

• 繼承之於 Nonstatic data members ,是指 base object members 存在在 derived object 中。

• 繼承之於 Member functions ,是指繼承了對 base class’s member function 的呼叫權利。

• 繼承之於 Static data member ,是指繼承了對 bass class static data member 的存取權利。

(10)

物件模型在繼承下

Layout 的原則

• C++ 保證,『出現在 derived class 中的 bass class subobject 有其完整之原樣性』 。

• Derived class layout =

[ direct bass class ]s + [ 自己新增的 data

(11)

單一繼承的物件模型

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

(12)

多重繼承的物件模型

• 多重繼承:指每一各 class 有兩個以上的 direct base class ,繼承的深度沒有限制。

Class CVertex{ Vertex *next; } oV; oV * next; Class CPoint3dV: public CPoint2d ,public CVertex { public: … float x; float y; float z; * next;

(13)

虛擬繼承

• Shared subobject 繼承的機制。

• 多重繼承與虛擬多重繼承的比較:

ios ios ios

ostream

istream istream ostream

(14)

虛擬繼承的物件模型 (1)

• 下面是 Cvertex3d 虛擬繼承的架構:

Class Point2d{ public : …

protected: float x; float y; };

Class Vertex:

public virtual Point2d{ public : …

protected : vertex *next; };

Class Vertex3d:

public virtual Vertex, public Point3d {

Class Point3d:

public virtual Point2d{ public : …

protected : float z; };

(15)

虛擬繼承的物件模型 (2)

Vptr_Point2d float x float y

Point oPt2d Vptr_Point2d float x float y float z vpbassPoint2d vptr_point3d vptr_Vertex vpbassPoint2d Vertex *next Float mumble Vertex3d oV3d Vptr_Point2d float x float y vptr_Vertex vpbassPoint2d Vertex *next Vertex oV Vptr_Point2d float x float y float z vpbassPoint2d vptr_point3d

(16)

Polymorphism(1)

• 多型:以同一指標指向不同型別的物件。 • 群:一群“同型”但不全然相同的個體。 Ex. 一群大 學生。 • 多型抽象目的:利用“群”的觀念,實現 general 演算 法,並保有“個體”間的差異。

• 不同的 derived class object 彼此之間有差異,但屬於相 同的 bass class“ 群” 。

• 多型實做方式: bass point 代表群,供 general 演算法 來使用, bass point 可指向向其 derived class object 保有 個體差異。

(17)

Polymorphism(2)

• Ex. Bass class 魚,

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

(18)

C++ 如何支援多型

• 經由隱含轉型動作,允許 derived class object 轉化給 base type point 來指。

• 經由虛擬機制喚起指標所指之 object 的 虛擬函式實體。

• Object 保有 type-info

• Dynamic_cast 可對 Object point 做型別轉 換的安全檢查。

(19)

當 derive object assign 給 bass pointer 時 ,需暗含 this point 位移調整時,稱

unnatural polymorphism 。

• 暗含的位移調整工作由 complier 偷偷插 入程式之中。

• Ex. Vertext *pVertex = new Vertext3d;

Unnatural polymorphism

float z vpbassPoint2d vptr_Vertex vpbassPoint2d Vertex *next Vertex * *pVertex this pointer (offset) Vertex3d object

(20)

Virtual function

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

(21)

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

(22)

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();

Virtual table for point show() ~point() Type_info * vptr ; float x;

參考文獻

相關文件

interface ITextBox : IControl// 繼承了介面 Icontrol 的方法 Paint() { void SetText(string text); }. interface IListBox : IControl// 繼承了介面 Icontrol 的方法 Paint() {

The hashCode method for a given class can be used to test for object equality and object inequality for that class. The hashCode method is used by the java.util.SortedSet

符合前條所定雇主應於每年中央主管機關公告期間內,檢附下列文件、資

• 承接視覺藝術科作為高中課程的 選修科,並繼續推動本科課程的 發展,教育局於2020/21學年開

135-141; GRETIL - Göttingen Register of Electronic Texts in Indian Languages: (http://gretil.sub.uni- goettingen.de/gretil/1_sanskr/4_rellit/buddh/psp_4u.htm) 英 譯 本 : Edward

有關於 Java 程式語言,下列何者敘述不正確?(A)Java 程式語言透過 extends 提供多重繼承 (Multiple

竊謂嫡室或鮮生育,乃緣 (緣於) 繼續大事 (此指繼承家族 血脈)

private void answerLB Click(object sender private void answerLB_Click(object sender,. System.EventArgs