台大资工多媒体实验室课件_第1页
台大资工多媒体实验室课件_第2页
台大资工多媒体实验室课件_第3页
台大资工多媒体实验室课件_第4页
台大资工多媒体实验室课件_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++ObjectModel台大資工多媒體實驗室PreviewWhatisC++objectmodel?ClassandobjectdatamemberaccesssingleobjectlayoutInheritanceobjectlayoutpolymorphismvirtualC++objectmodelC++compiler底層的實做機制,用來實做各物件的運作模型,使之能具備C++諸多物件導向的性質。物件模型底層的實做機制並未標準化,各家compiler作法不一。但解答許多問題必須根源與我們對C++objectmodel的瞭解。StaticDataMember屬於class層級的資料,所有object共享一份staticdatamember。存取staticmember不需要透過任何的object,在無任何object時已透過memberselectionoperators來存取。所有的存取都會被compiler轉化為extern實體的直接參考動作Ex. CPoint3D::size=300;NonstaticDataMember對於nonstaticdatamember的存取,實際上是透過implicit的this指標來完成。存取會轉換成&(this)+(datamemberoffset)由於offset在compilertime就可算出,其效率等於存取一個Cstructmember.SingleObjectlayout一個object的實體之內只含class之nonstaticdatamember及某些輔助機制(vptr)。Classmemberfunctions獨立於object實體之外是獨一無二的一份函示實體(即多個object共享相同的函示實體。)同一個accesssection的datamembers排列順序根據其宣告順序而定。Accesssection的排列順序無強制規定。Inheritance繼承之於Nonstaticdatamembers,是指baseobjectmembers存在在derivedobject中。繼承之於Memberfunctions,是指繼承了對baseclass’smemberfunction的呼叫權利。繼承之於Staticdatamember,是指繼承了對bassclassstaticdatamember的存取權利。物件模型在繼承下

Layout的原則C++保證,『出現在derivedclass中的bassclasssubobject有其完整之原樣性』。Derivedclasslayout=[directbassclass]s+[自己新增的datamember(nonstaticdataorvptr)]單一繼承的物件模型單一繼承:指每一個class的directbassclass只能有一個,繼承的深度沒有限制。ClassCPoint2d{public:…..protected:floatx;floaty;}oPt2d;floatx;floaty;oPt2dClassCPoint3d:publicCPoint2d{public:…protected:floatz;}oPt3d;oPt3dfloatx;floaty;floatz;虛擬繼承Sharedsubobject繼承的機制。多重繼承與虛擬多重繼承的比較:多重繼承虛擬多重繼承iosiosiosostreamistreamistreamostreamiostreamiostream虛擬繼承的物件模型(1)下面是Cvertex3d虛擬繼承的架構:ClassPoint2d{public:…protected:floatx;floaty;};ClassVertex:publicvirtualPoint2d{public:…protected:vertex*next;};ClassVertex3d:publicvirtualVertex,publicPoint3d{public:…protected:floatz;};ClassPoint3d:publicvirtualPoint2d{public:…protected:floatz;};虛擬繼承的物件模型(2)Vptr_Point2dfloatxfloatyPointoPt2dVptr_Point2dfloatxfloatyfloatzvpbassPoint2dvptr_point3dvptr_VertexvpbassPoint2dVertex*nextFloatmumbleVertex3doV3dVptr_Point2dfloatxfloatyvptr_VertexvpbassPoint2dVertex*nextVertexoVVptr_Point2dfloatxfloatyfloatzvpbassPoint2dvptr_point3dPoint3doPt3dPolymorphism(2)Ex.Bassclass魚,

driveclass大肚魚,金魚,鯊魚 魚的point可以指向大肚魚、金魚、鯊魚魚的object。利用演算法:『由第一隻魚到最後一隻魚,魚開始游泳』可使所有的魚都開始游泳,但不同類的魚會依照自己的方式來游。演算法簡潔,且保持個體之間的特性。演算法設計者不需瞭解物件的如何實做。C++如何支援多型經由隱含轉型動作,允許derivedclassobject轉化給basetypepoint來指。經由虛擬機制喚起指標所指之object的虛擬函式實體。Object保有type-info。Dynamic_cast可對Objectpoint做型別轉換的安全檢查。當deriveobject

assign給basspointer時,需暗含thispoint位移調整時,稱unnaturalpolymorphism。暗含的位移調整工作由complier偷偷插入程式之中。Ex. Vertext*pVertex=newVertext3d;UnnaturalpolymorphismfloatzvpbassPoint2dvptr_point3dvptr_VertexvpbassPoint2dVertex*nextVertex**pVertexthispointer(offset)Vertex3dobjectVirtualfunctioninObjectmodel每個object內有一個vptr指標,指向virtualfunctiontable。每一個class有一個virtualfunctiontable(供object之vptr所指)內含class之中有作用的virtualfunction的address。Virtualfunctiontable的index0存放的是type-info用以支援runtimetypeidentification(RTTI)。C++物件模型兩種datamember:static/nonstaticdata;三種member

function:static/nonstatic/virtualfunction;ClassPoint{public: point(floatxtal); virtual~Point(); floatx()const; staticintPointCount();p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论