编写一个动物基类,动物基类的属性有跑,飞,游泳三个,让猪、鱼、鸟这三个类继承动物类,但是每个对应的只能有自己特有的属性,比如猪肯定不能飞(飞猪?肥猪)!
#include "stdafx.h"
#include <iostream>
using namespace std;
enum ANIMAL_TYPES
{
fish,
bird,
pig,
}; //枚举
template <ANIMAL_TYPES at>
class Animal
{
public:
void swim();
void fly();
void walk();
};
template <>
void Animal<ANIMAL_TYPES::fish>::swim()
{
cout << "fish:游泳!!!!!!"<<endl;
}
template <> //模板的完全特化
void Animal<ANIMAL_TYPES::bird>::fly()
{
cout << "bird:我要飞得更高!" << endl;
}
template <>
void Animal<ANIMAL_TYPES::pig>::walk()
{
cout << "pig:老子散散步!!" << endl;
}
template <ANIMAL_TYPES at>
class Pig : public Animal<ANIMAL_TYPES::pig>
{
public:
Pig(){}
virtual~Pig(){}
};
template<ANIMAL_TYPES at>
class Fish : public Animal<ANIMAL_TYPES::fish>
{
public:
};
template <ANIMAL_TYPES at>
class Bird : public Animal<ANIMAL_TYPES::bird>
{
public:
};
int _tmain(int argc, _TCHAR* argv[])
{
Pig<ANIMAL_TYPES::pig> onePig;
onePig.walk();
Bird<ANIMAL_TYPES::bird> oneBird;
oneBird.fly();
Fish<ANIMAL_TYPES::fish> oneFish;
oneFish.swim();
// oneFish.fly();//Error
int a;
cin >> a;
return 0;
}
上面的方法主要用到了类模板成员函数的特化这个知识点;
基类Animal的三个普通成员函数 walk(),swim(),fly()都具有一个外围模板类即是Animal类,因此在实现的时候需要使用一个template<>前缀来声明:后面使用一个模板实参来对它进行全局特化,
template <>
void Animal<Animal::pig>::walk()
{
cout << "pig:老子散散步!!" << endl;
}
前面template<>前缀
后面<ANimal::pig>
进行全局特化
Fish<ANIMAL_TYPES::fish> oneFish;
oneFish.swim();
// oneFish.fly();//Error
oneFish这个对象虽然也有fly()属性,但是运行会报错,达到了我们需要的效果!
template<typename T>
class Quoter
{
public:
void print()const
{
cout << "hhh" << endl;
}
};
template<>
void Quoter<void>::print()const
{
cout << "Quote<void>";
}
int _tmain(int argc, _TCHAR* argv[])
{
Quoter<void> test;
test.print();
int a;
cin >> a;
return 0;
}
输出:Quote
原文地址:http://blog.csdn.net/djb100316878/article/details/46287555