freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

com接口與對象-在線瀏覽

2024-12-02 21:52本頁面
  

【正文】 對象 class IString { virtual const char*Find(const char *psz)=0。 }。 public: CMyString(const char * psz)。 const char*Find(const char *psz)。 }。 extern C IString *CreateString(const char *psz) { return new CMyString(psz)。 void main() { IString *p。 if (p) { const char*psz = pFind(llo)。 } }。 void main() { IString *p。 if (NULL!=h) { PfnCreateString pfn = (PfnCreateString)GetProcAddress(h,CreateString)。 if (p) { const char*psz = pFind(llo)。 } } // Be careful about calling FreeLibrary. } }。 virtual const char*Find(const char *psz)=0。 }。 public: CMyString(const char * psz)。 void Delete()。 int Length()。 void CMyString::Delete() { delete this。 p = CreateString(Hello)。 int n = pLength()。 } }。 virtual const char*Find(const char *psz)。 virtual char FindAt(int index)。 新客戶 老的對象 對象的進化(續(xù)) ?完全增加新的功能 class IPersist { virtual void Delete()。 virtual void Load(const char *pszFile)。 客戶 對象 IString IPersist ? 接口的進化 ?對象的接口不能發(fā)生變化 –如果接口中需要增加新的方法,可以派生出新的接口來 class IString2 : public IString { virtual char FindAt(int index)。 ?新對象實現(xiàn)兩個接口: IString2和 IString –不打斷新的客戶與老的對象之間的關系 –但是客戶必須明確地知道對象是否實現(xiàn)了自己感興趣的接口 對象實現(xiàn)多個接口 ?假如對象實現(xiàn)了兩個接口 IString和 IPersist –客戶需要在 runtime時明確地知道接口的類型信息,包括通過創(chuàng)建函數(shù)得到的初始接口類型 – at runtime, 客戶可以靈活地從一個接口變換到另一個接口,如果對象不支持某個接口,客戶也有辦法知道 –回憶 RTTI(Runtime type identification) ?dynamic_cast ?RTTI依賴于編譯器的實現(xiàn) ?RTTI只能用于類的繼承層次中 對象實現(xiàn)多個接口 (續(xù)一 ) ?所以我們需要自己構造一套類型機制,要求: –每個接口都要提供類型轉換機制,能轉換到同一對象上實現(xiàn)的其他接口 –客戶只要得到了一個接口就可以得到其他的接口,所以創(chuàng)建函數(shù)可以返回任一個接口 –如果對象不支持某個接口,客戶必須能明確地知道,而不是發(fā)生異常 —— robust – Dynamic_cast 對象實現(xiàn)多個接口 (續(xù)二 ) ?一個對象實現(xiàn) IString2和 IString接口 : class IString { virtual void Delete()=0。 virtual const char*Find(const char *psz)=0。 }。 }。 else if (strcmp(psz,IString2)==0) return static_castIString2 *(this)。 } 對象實現(xiàn)多個接口 (續(xù)四 ) include void main() { IString *p = CreateString(Hello)。 const char*psz = pFind(llo)。 if ((p2=(IString2 *)pDynamic_cast(IString2))) char c = p2FindAt(3)。 } }。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void Load(const char *pszFile)=0。 對象實現(xiàn)多個接口 (續(xù)五 ) ?一個對象實現(xiàn)兩個沒有繼承關系的接口 include class CMyString : public IString2, public IPersist {...} void *CMyString::Dynamic_cast(const char *psz) { if (strcmp(psz,IString)==0) return static_castIString *(this)。 else if (strcmp(psz,IPersist)==0) return static_castIPersist *(this)。 } 對象實現(xiàn)多個接口 (續(xù)六 ) void main() { IString *p = CreateString(Hello)。 IPersist *p3。 int n = pLength()。 if ((p3=(IPersist *)pDynamic_cast(IPersist))) p3Save(c:\\temp\\)。 } }。每個接口都有Delete函數(shù)?還是只有一個接口才有?進一步, 什么時候刪除對象? ?客戶可能擁有多個指向對象的引用, 每個引用各有自己的 lifetime ?每個引用從被有效賦值開始,一直到生命周期結束,這期間被稱為: outstanding reference 未完結引用 ?客戶管理每個引用的 lifetime, 也就是說它要 顯式 地告訴對象引用無效了 對象的生命周期管理 (續(xù) ) ?每個對象要管理一個被稱為引用計數(shù)(reference count)的整數(shù)值。引用計數(shù)從 0開始,首次把接口遞交給客戶時為 1,以后由客戶管理,當引用計數(shù)回到 0時,刪除自己。 virtual void *Dynamic_cast(const char *psz)=0。 virtual const char*Find(const char *psz)=0。 }。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void Save(const char *pszFile)=0。 }。 else m_psz[0] = 0。 if (0==m_refcount) delete this。 } include class CMyString : public IString2, public IPersist { private: char *m_psz。 public: CMyString(const char * psz)。 void DuplicatePointer()。 void *Dynamic_cast(const char *)。 int Length()。 void Save(const char *pszFile)。 }。 if (strcmp(psz,IString)==0) p = static_castIString *(this)。 else if (strcmp(psz,IPersist)==0) p = static_castIPersist *(this)。 return p。 if (p) { IString2 *p2。 const char*psz = pFind(llo)。 if ((p2=(IString2 *)pDynamic_cast(IString2))) { char c = p2FindAt(3)。 } if ((p3=(IPersist *)pDynamic_cast(IPersist))) { p3Save(c:\\temp\\)。 }
點擊復制文檔內容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1