c++ object model

22
C++ Object Model 台台台台台台 台台台 台台台

Upload: zora

Post on 04-Jan-2016

89 views

Category:

Documents


5 download

DESCRIPTION

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++ 諸多物件導向的性質。 物件模型底層的實做機制並未標準化,各家 compiler 作法不一。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C++ Object Model

C++ Object Model

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

Page 2: C++ Object Model

Preview

• What is C++ object model ?

• Class and object

• data member access

• single object layout

• Inheritance object layout

• polymorphism

• virtual

Page 3: C++ Object Model

C++ object model

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

• 物件模型底層的實做機制並未標準化,各家 compiler 作法不一。

• 但解答許多問題必須根源與我們對 C++ object model 的瞭解。

Page 4: C++ Object Model

Class

• Class 是一種 abstract data type.

• 在 class 宣告時,包含兩種成員:– 1.data member :描述 class object 之屬性。– 2.member function :描述 class object 之行為。

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

Page 5: C++ Object Model

Static Data Member

• 屬於 class 層級的資料,所有 object 共享一份 static data member 。

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

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

Ex. CPoint3D::size = 300;

Page 6: C++ Object Model

Nonstatic Data Member

• 對於 nonstatic data member 的存取,實際上是透過 implicit 的 this 指標來完成。

• 存取會轉換成&(this) + (data member offset)

•由於 offset 在 compiler time 就可算出,其效率等於存取一個 C struct member.

Page 7: C++ Object Model

Single Object layout

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

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

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

• Access section 的排列順序無強制規定。

Page 8: C++ Object Model

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

Page 9: C++ Object Model

Inheritance

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

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

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

Page 10: C++ Object Model

物件模型在繼承下Layout 的原則

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

• Derived class layout =

[ direct bass class ]s + [ 自己新增的 data member (nonstatic data or vptr) ]

Page 11: C++ Object Model

單一繼承的物件模型• 單一繼承:指每一個 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;

Page 12: C++ Object Model

多重繼承的物件模型• 多重繼承:指每一各 class 有兩個以上的

direct base class ,繼承的深度沒有限制。

Class CVertex{

Vertex *next;

} oV;oV

* next;

Class CPoint3dV:

public CPoint2d

,public CVertex

{

public: …

protected: float z;

}oPt3dV ;oPt3dV

float x;

float y;

float z;

* next;

Page 13: C++ Object Model

虛擬繼承• Shared subobject 繼承的機制。• 多重繼承與虛擬多重繼承的比較:

多重繼承 虛擬多重繼承

ios ios ios

ostreamistream istream ostream

iostream iostream

Page 14: C++ Object Model

虛擬繼承的物件模型 (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 {public : …protected : float z;};

Class Point3d: public virtual Point2d{public : …protected : float z;};

Page 15: C++ Object Model

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

Vptr_Point2dfloat xfloat y

Point oPt2d Vptr_Point2dfloat xfloat y

float zvpbassPoint2dvptr_point3d

vptr_VertexvpbassPoint2dVertex *next

Float mumble

Vertex3d oV3d

Vptr_Point2dfloat xfloat y

vptr_VertexvpbassPoint2dVertex *next

Vertex oV

Vptr_Point2dfloat xfloat y

float zvpbassPoint2dvptr_point3d

Point3d oPt3d

Page 16: C++ Object Model

Polymorphism(1)• 多型:以同一指標指向不同型別的物件。• 群:一群“同型”但不全然相同的個體。 Ex. 一群大

學生。• 多型抽象目的:利用“群”的觀念,實現 general 演

算法,並保有“個體”間的差異。• 不同的 derived class object 彼此之間有差異,但屬於

相同的 bass class“ 群” 。• 多型實做方式: bass point 代表群,供 general 演算法

來使用, bass point 可指向向其 derived class object 保有個體差異。

Page 17: C++ Object Model

Polymorphism(2)

• Ex. Bass class 魚, drive class 大肚魚,金魚,鯊魚

魚的 point 可以指向大肚魚、金魚、鯊魚魚的object 。利用演算法:『由第一隻魚到最後一隻魚,魚開始游泳』可使所有的魚都開始游泳,但不同類的魚會依照自己的方式來游。

• 演算法簡潔,且保持個體之間的特性。• 演算法設計者不需瞭解物件的如何實做。

Page 18: C++ Object Model

C++ 如何支援多型• 經由隱含轉型動作,允許 derived class

object 轉化給 base type point 來指。• 經由虛擬機制喚起指標所指之 object 的

虛擬函式實體。• Object 保有 type-info 。• Dynamic_cast 可對 Object point 做型別轉

換的安全檢查。

Page 19: C++ Object Model

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

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

• Ex. Vertext *pVertex = new Vertext3d;

Unnatural polymorphism

float zvpbassPoint2dvptr_point3d

vptr_VertexvpbassPoint2dVertex *next

Vertex *

*pVertex

this pointer

(offset)

Vertex3dobject

Page 20: C++ Object Model

Virtual function

• Ex. Point2d * pPoint = new Vertex3d;

pPoint->draw();• 當你希望 draw() 的呼叫是根據 pPoint 所指的物

件而不是 pPoint 的型別時, draw() 必須是virtual function 。

• Virtual function :使當利用指標來呼叫函式時,呼叫的函式實體是根據指標所指的物件的型別來決定,而不是根據指標的型別來決定。

Page 21: C++ Object Model

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) 。

Page 22: C++ Object Model

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;