c++ object model
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 PresentationTRANSCRIPT
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 作法不一。
• 但解答許多問題必須根源與我們對 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 。
Static Data Member
• 屬於 class 層級的資料,所有 object 共享一份 static data member 。
• 存取 static member 不需要透過任何的object ,在無任何 object 時已透過member selection operators 來存取。
• 所有的存取都會被 compiler 轉化為 extern實體的直接參考動作
Ex. CPoint3D::size = 300;
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 只能有一個,繼承的深度沒有限制。
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: …
protected: float z;
}oPt3dV ;oPt3dV
float x;
float y;
float z;
* next;
虛擬繼承• Shared subobject 繼承的機制。• 多重繼承與虛擬多重繼承的比較:
多重繼承 虛擬多重繼承
ios ios ios
ostreamistream istream ostream
iostream iostream
虛擬繼承的物件模型 (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;};
虛擬繼承的物件模型 (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
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 zvpbassPoint2dvptr_point3d
vptr_VertexvpbassPoint2dVertex *next
Vertex *
*pVertex
this pointer
(offset)
Vertex3dobject
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) 。
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;