, Dynamic_Cast. :
void f(void) { IFastString *pfs = 0; IPersistentObject *ppo = 0; pfs = CreateFastString("Feed BOB"); if (pfs) { ppo = (IPersistentObject *) pfs->Dynamic_Cast("IPersistentObject"); if (!ppo) pfs->Delete(); else { ppo->Save("C:\\autoexec.bat"); ppo->Delete(); } } }
IFastString, Delete IPersistentObject. C++ , vtbl, IExtensibleObject, Delete. , , , , Delete . , , . . . , : , ( " ", on the heap).
, , , , . IExtensibleObject
class IExtensibleObject { public: virtual void *Dynamic_Cast (const char* pszType) =0; virtual void Delete(void) = 0; };
class IExtensibleObject { public: virtual void *Dynamic_Cast(const char* pszType) = 0; virtual void DuplicatePointer(void) = 0; virtual void DestroyPointer(void) = 0; };
, IExtensibleObject : 1) , DuplicatePointer. 2) , DestroyPointer.
: , :
class FastString : public IFastString, public IPersistentObject { int m_cPtrs; // count of outstanding ptrs // public: // initialize pointer count to zero // FastString(const char *psz) : m_cPtrs(0) { } void DuplicatePointer(void) { // note duplication of pointer // ++m_cPtrs; } void DestroyPointer(void) { // destroy object when last pointer destroyed // , if (--m_cPtrs == 0) delete this; } : : : };
- , .
, , , DuplicatePointer/DestroyPointer. FastString . CreateFastString , C++, . , DuplicatePointer:
IFastString* CreateFastString(const char *psz) { IFastString *pfsResult = new FastString(psz); if (pfsResult) pfsResult->DuplicatePointer(); return pfsResult; }
Dynamic_Cast:
void *FastString::Dynamic_Cast(const char *pszType) { void *pvResult = 0; if (strcmp(pszType, "IFastString") == 0) pvResult = static_cast<IFastString*>(this); else if (strcmp(pszType, "IPersistentObject") == 0) pvResult = static_cast<IPersistentObject*>(this); else if (strcmp(pszType, "IExtensibleObject") == 0) pvResult = static_cast<IFastString*>(this); else return 0; // request for unsupported interface // // pvResult now contains a duplicated pointer, so // we must call DuplicatePointer prior to returning // pvResult , // DuplicatePointer ((IExtensibleObject*)pvResult)->DuplicatePo1nter(); return pvResult; }
:
void f(void) { IFastString *pfs = 0; IPersistentObject *ppo = 0; pfs = CreateFastString("Feed BOB"); if (pts) { = (IPersistentObject *) pfs->Dynamic_Cast("IPersistentObject"); if (ppo) { ppo->Save("C:\\autoexec.bat"); ppo->DestroyPointer(); } pfs->DestroyPointer(); } }
, , . . DuplicatePointer DestroyPointer (smart pointer) C++.
. . , . FastString . , , , . , .