Dziedziczymy publicznie od klasy ErrorHandling, tak więc wszystkie metody tej klasy od tej pory wchodzą w skład klasy SmartPtr. Co więcej, zachowanie tych metod zmienia się w zależności od tego jaką klasę wyślemy w miejsce ErrorHandling. Tak więc, gdy wywołamy np. metodę void ErrorHandling :: Check(), to gdy ErrorHandling będzie równe NoChecking, wtedy nie będzie żadnego sprawdzania. Natomiast gdy wyślemy StrictCheckcing, to każda dereferencja wskaźnika przy wywołaniu (w tym przypadku) metody Get() będzie sprawdzana:

template <class T> struct NoChecking

void Check(T * _ptr) { /* pusto, brak sprawdzania poprawności */ }

template <class T> struct StrictChecking

void Check(T * _ptr) { if (0 == _ptr) { /* obsłuż błąd */ } }

// Opis klasy: // Wytyczna ErrorHandling musi posiadać metodę void Check(T*) template <class T, class ErrorHandling> class SmartPtr : public ErrorHandling

public:

T * Get() const

Check(_ptr); // <----- !!!