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); // <----- !!!