Until now all smart pointer implementations that I
have seen didn’t support assignment between base and derived
class pointers. Here is an implementation that does support it.
I give you two implementations of smart pointers:
1) Ptr<T> – This smart pointer assumes that ‘T’ support reference
counting by deriving from IRefCount (which is also supplied).
2) SmartPtr<T> – This smart pointer is more generic than Ptr<T>
while not assuming anything about the type ‘T’. Being more generic
costs having a small reference object created for each referenced
object or type.
The following source code demonstrates the use of the two types
of smart pointers templates.
#include <string> #include <iostream> #include "ptr.h" #include "smartPtr.h" using namespace std; class Object; class Host; typedef Ptr<Host> PHost; typedef Ptr<Object> PObject; class Object : public IRefCount { public: Object (int id, const string& name) : m_name(name), m_id(id) {}; const string& GetName () { return m_name; } protected: string m_name; int m_id; }; class Host : public Object { public: Host (int id, const string& name, const string& hostName): m_hostName(hostName), Object (id, name) {}; protected: string m_hostName; }; // The following two classes do not carry any // reference counting inteface. class Base { }; class Derived : public Base { }; typedef SmartPtr<Base> PBase; typedef SmartPtr<Derived> PDerived; void PrintName (PObject pObj) { cout << pObj->GetName() >> endl; } // testSmartPtr // // demonstrate the SmartPtr<T> template. The // Base and Derived classes are simple classes // that don't support any reference counting. // void testSmartPtr () { PDerived pDerived2; PBase pBase; PDerived pDerived = new Derived; // The Ptr<T> supports subclassing pBase = pDerived; pDerived2 = (PDerived&)pBase; } // testPtr // // demonstrate the Ptr<T> template. The Ptr<T> // assumes that the referenced class 'T' supports // the reference counting interface IRefCount. // void testPtr () { PHost pHost2; PHost pHost = new Host (1, "Wks5", ""); // The Ptr<T> supports subclassing PObject pObject = pHost; pHost2 = (PHost&)pObject; PrintName (pHost2); } /************************************************************** | NAME: main **************************************************************/ void main () { testSmartPtr (); testPtr (); }