《台大资工多媒体实验室.ppt》由会员分享,可在线阅读,更多相关《台大资工多媒体实验室.ppt(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C+Object Model台大資工多媒體實驗室 林昂賢PreviewWhat is C+object model?Class and objectdata member accesssingle object layoutInheritance object layoutpolymorphismvirtualC+object modelC+compiler底層的實做機制,用來實做各物件的運作模型,使之能具備C+諸多物件導向的性質。物件模型底層的實做機制並未標準化,各家compiler作法不一。但解答許多問題必須根源與我們對C+object model的瞭解。ClassClass是一種abst
2、ract 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 ope
3、rators 來存取。所有的存取都會被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及某些輔助機制(vpt
4、r)。Class member functions 獨立於object實體之外是獨一無二的一份函示實體(即多個object共享相同的函示實體。)同一個access section的data members排列順序根據其宣告順序而定。Access section的排列順序無強制規定。Single Object layout(cont.2)Class CPoint3dpublic:/.Private:float x;static int size=250;int y;void draw();static int point-count();private:char z;CPoint3d objec
5、txyzInheritance繼承之於Nonstatic data members,是指base object members存在在derived object 中。繼承之於Member functions,是指繼承了對base classs member function的呼叫權利。繼承之於Static data member,是指繼承了對bass class static data member的存取權利。物件模型在繼承下Layout的原則C+保證,出現在derived class中的bass class subobject有其完整之原樣性。Derived class layout=dir
6、ect bass class s+自己新增的data member(nonstatic data or vptr)單一繼承的物件模型單一繼承:指每一個class的direct bass class只能有一個,繼承的深度沒有限制。Class CPoint2dpublic:.protected:float x;float y;oPt2d;float x;float y;oPt2dClass CPoint3d:public CPoint2dpublic:protected:float z;oPt3d;oPt3dfloat x;float y;float z;多重繼承的物件模型多重繼承:指每一各cla
7、ss有兩個以上的direct base class,繼承的深度沒有限制。Class CVertexVertex*next;oV;oV*next;Class CPoint3dV:public CPoint2d ,public CVertexpublic:protected:float z;oPt3dV;oPt3dVfloat x;float y;float z;*next;虛擬繼承Shared subobject 繼承的機制。多重繼承與虛擬多重繼承的比較:多重繼承虛擬多重繼承iosiosiosostreamistreamistreamostreamiostreamiostream虛擬繼承的物件模
8、型(1)下面是Cvertex3d虛擬繼承的架構:Class Point2dpublic:protected:float x;float y;Class Vertex:public virtual Point2dpublic:protected:vertex*next;Class Vertex3d:public virtual Vertex,public Point3d public:protected:float z;Class Point3d:public virtual Point2dpublic:protected:float z;虛擬繼承的物件模型(2)Vptr_Point2dfloa
9、t xfloat yPoint oPt2dVptr_Point2dfloat xfloat yfloat zvpbassPoint2dvptr_point3dvptr_VertexvpbassPoint2dVertex*nextFloat mumbleVertex3d oV3dVptr_Point2dfloat xfloat yvptr_VertexvpbassPoint2dVertex*nextVertex oVVptr_Point2dfloat xfloat yfloat zvpbassPoint2dvptr_point3dPoint3d oPt3dPolymorphism(1)多型:以同
10、一指標指向不同型別的物件。群:一群“同型”但不全然相同的個體。Ex.一群大學生。多型抽象目的:利用“群”的觀念,實現general演算法,並保有“個體”間的差異。不同的derived class object彼此之間有差異,但屬於相同的bass class“群”。多型實做方式:bass point代表群,供general演算法來使用,bass point可指向向其derived class object保有個體差異。Polymorphism(2)Ex.Bass class 魚,drive class 大肚魚,金魚,鯊魚魚的point可以指向大肚魚、金魚、鯊魚魚的object。利用演算法:由第一
11、隻魚到最後一隻魚,魚開始游泳可使所有的魚都開始游泳,但不同類的魚會依照自己的方式來游。演算法簡潔,且保持個體之間的特性。演算法設計者不需瞭解物件的如何實做。C+如何支援多型經由隱含轉型動作,允許derived class object轉化給base type point來指。經由虛擬機制喚起指標所指之object的虛擬函式實體。Object保有type-info。Dynamic_cast可對Object point做型別轉換的安全檢查。當derive object assign 給bass pointer時,需暗含this point位移調整時,稱unnatural polymorphism。
12、暗含的位移調整工作由complier偷偷插入程式之中。Ex.Vertext*pVertex=new Vertext3d;Unnatural polymorphismfloat zvpbassPoint2dvptr_point3dvptr_VertexvpbassPoint2dVertex*nextVertex*pVertexthis pointer(offset)Vertex3dobjectVirtual functionEx.Point2d*pPoint=new Vertex3d;pPoint-draw();當你希望draw()的呼叫是根據pPoint所指的物件而不是pPoint的型別時,d
13、raw()必須是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-inf
14、o用以支援runtime type identification(RTTI)。C+物件模型兩種data member:static/nonstatic data;三種member function:static/nonstatic/virtual function;Class Pointpublic:point(float xtal);virtual Point();float x()const;static int PointCount();protected:virtual void show();float x;static int point-count;Virtual table for pointpoint-countPointCount()point(float)x()show()point()Type_info*vptr;float x;