C++ Object Model
台大資工多媒體實驗室 林昂賢
Preview
• What is C++ object model ? • Class and object
• data member access • single object layout
• Inheritance object layout • polymorphism
C++ object model
• C++ compiler 底層的實做機制,用來實 做各物件的運作模型,使之能具備 C++ 諸多物件導向的性質。 • 物件模型底層的實做機制並未標準化, 各家 compiler 作法不一。 • 但解答許多問題必須根源與我們對 C++ object model 的瞭解。Class
• Class 是一種 abstract data type.
• 在 class 宣告時,包含兩種成員:
– 1.data member :描述 class object 之屬性。 – 2.member function :描述 class object 之行為
。
• 利用 class 這樣的 abstract data type ,我們 可以定義出 ( 造出)許多的這種 type 的
Static Data Member
• 屬於 class 層級的資料,所有 object 共享
一份 static data member 。
• 存取 static member 不需要透過任何的 object ,在無任何 object 時已透過
member selection operators 來存取。
• 所有的存取都會被 compiler 轉化為 extern 實體的直接參考動作
Nonstatic Data Member
• 對於 nonstatic data member 的存取,實際
上是透過 implicit 的 this 指標來完成。
• 存取會轉換成
&(this) + (data member offset)
•由於 offset 在 compiler time 就可算出,
Single Object layout
• 一個 object 的實體之內只含 class 之 nonstatic data member 及某些輔助機制 (vptr) 。
• Class member functions 獨立於 object 實體之外 是獨一無二的一份函示實體(即多個 object 共 享相同的函示實體。)
• 同一個 access section 的 data members 排列順序 根據其宣告順序而定。
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
單一繼承的物件模型
• 單一繼承:指每一個 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;
多重繼承的物件模型
• 多重繼承:指每一各 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;
虛擬繼承
• Shared subobject 繼承的機制。
• 多重繼承與虛擬多重繼承的比較:
ios ios ios
ostream
istream istream ostream
虛擬繼承的物件模型 (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; };
虛擬繼承的物件模型 (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
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 的 虛擬函式實體。
• Object 保有 type-info 。
• Dynamic_cast 可對 Object point 做型別轉 換的安全檢查。
• 當 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 objectVirtual 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
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;