Template ed ereditarieta`
E` possibile utilizzare contemporaneamente ereditarieta` e template
in vari modi. Supponendo di avere una gerarchia di figure geometriche potremmo
ad esempio avere le seguenti istanze di TList :
TList < TBaseShape > ShapesList;
TList < TRectangle > RectanglesList;
TList < TTriangle > TrianglesList;
tuttavia in questi casi gli oggetti ShapesList , RectanglesList
e TrianglesList non sono legati da alcun vincolo di discendenza,
indipendentemente dal fatto che le classi TBaseShape , TRectangle
e TTriangle lo siano o meno. Naturalmente se TBaseShape
e` una classe base delle altre due, e` possibile memorizzare in ShapesList
anche oggetti TRectangle e TTriangle perche` in effetti
TList memorizza dei riferimenti, sui quali valgono le stesse regole
per i puntatori a classi base.
Istanze diverse dello stesso template non sono mai legate dunque da relazioni
di discendenza, indipendentemente dal fatto che lo siano i parametri delle istanze
del template. La cosa non e` poi tanto strana se si pensa al modo in
cui sono gestiti e istanziati i template.
Un altro modo di combinare ereditarieta` e template e` dato dal seguente
esempio:
template< typename T >
class Base {
/* ... */
};
template< typename T >
class Derived : public Base< T > {
/* ... */
};
Base < double > A;
Base < int > B;
Derived < int > C;
in questo caso l'ereditarieta` e` stata utilizzata per estendere le caratteristiche
della classe template Base , Tuttavia anche in questo caso
tra le istanze dei template non vi e` alcuna relazione di discendenza, in particolare
non esiste tra B e C ; un puntatore a Base
< T > non potra` mai puntare a Derived <
T > .
|