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 ();
}
Downloads
Download demo project – 6 Kb
Download source – 3 Kb