private:
BYTE* m_pbMtabl; public:
void * PvDołącz(void * pv, long lcElem=1); void * PvPrzy(long lindeks) const;
};
template <class T> dass Drg : private bazaDrg
private: int m_it; public:
Drg() : bazaDrg(sizeof(T)), m_it(0)
Drg(const Drg<T> &drg): bazaDrg(drg)
m_it = drg.m_it;
T &operator*(void) const
return *(T *)PvPrzy(m_it);
T *Dołącz(const T &t)
return (T *)PvDołącz((void *)&t);
};
Gdy używamy szablonów, wówczas każdy egzemplarz klasy utworzony z szablonu zawiera cały kod z deklaracji szablonu. Załóżmy na przykład, że tworzymy klasy Drg<char>, Drg<int> oraz Drg<coś>. Zgodnie z fragmentem „Przed” każda z trzech implementacji zawierałaby kopię funkcji PvDołącz, PvPrzy i innych funkcji pomocniczych. Oczywiście każda z tych funkcji byłaby dostosowana do konkretnego typu danych.
We fragmencie „Po” widzimy, że utworzyliśmy klasę podstawową o nazwie bazaDrg. Zawarliśmy w niej zestaw funkcji pomocniczych działających na wskaźnikach do void (void *). Klasa powstała z szablonu dziedziczy te funkcje, a bezpieczny i zgodny z typem dostęp do nich jest realizowany przez publiczne funkcje składowe. W przeciwieństwie do fragmentu „Przed” każda nowa konkretyzacja szablonu we fragmencie „Po” nie powoduje powtórzenia wszystkich funkcji pomocniczych. Każda