1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| template<typename Derive>
class Base
{
public:
typedef Derive type;// type reel a instancier.
Base(){
}
Base(const Base&){
std::cout<<"Base"<<std::endl;
}
};
// spécialisation partielle uniquement si tu as besoin d'instancier Base
template<>
class Base<void>
{
public:
typedef Base type;
Base(){
}
Base(const Base&){
std::cout<<"Base"<<std::endl;
}
};
class Derive1 :public Base<Derive1>
{
public:
Derive1(){
}
Derive1(const Derive1&){
std::cout<<"Derive1"<<std::endl;
}
};
class Derive2 :public Base<Derive2>
{
public:
Derive2(){
}
Derive2(const Derive2&){
std::cout<<"Derive2"<<std::endl;
}
};
template<class T>
T* Nouveau(const T*P_t)
{
return new T::type(*P_t);
}
int main(int argc, char **argv)
{
Base<void> base;
Derive1 b;
Derive2 c;
std::cout<<"clonage"<<std::endl;
delete Nouveau(&base);
delete Nouveau(&b);
delete Nouveau(&c);
return 0;
} |
Partager