例如一个模板类Animal(动物)中有一个方法Fly(飞),模板参数可以传入各类动物,如飞鸟类(BirdType)、昆虫类(InsectType)、走兽类(BeastType)等,但不是每类动物都会飞,各类可以飞的动物飞的方法也不一样,需要根据传入的模板参数类型,有不同的方式。
虽然这里的实现也可以用虚拟多态实,但是这里的Animal与的BirdType、InsectType、BeastType并不存在继承关系。
//代码可复制直接测试
#include <iostream>
using namespace std;
class BirdType//鸟类
{
};
class InsectType//昆虫类
{
};
class BeastType//走兽类
{
};
template <typename T>
class Animal
{
template <typename A>
class Traits
{
};
template <>
class Traits<BirdType>
{
public:
void fly()
{
cout<<"Birder fly "<<endl;
}
};
template <>
class Traits<InsectType>
{
public:
void fly()
{
cout<<"Insect fly "<<endl;
}
};
template <>
class Traits<BeastType>
{
public:
void fly()
{
cout<<"Beast can't fly "<<endl;
}
};
public:
void Fly()
{
Traits<T>().fly();
};
};
void main()
{
Animal<BirdType> brider;
brider.Fly();
Animal<InsectType> insect;
insect.Fly();
Animal<BeastType> beast;
beast.Fly();
}