//在基类中调用子类的方法
template <typename T>
class base
{
public:
void test()
{
//在基类中用派生类对象
T& obj = static_cast<T&>(*this);
obj.pf();//在基类中调用子类的方法
}
private:
base() {};
friend T;//防止子类中写错
};
//template<typename T>
class child :public base<child>
{
public:
void pf()
{
std::cout << "child exec" << std::endl;
}
};
template<typename T>
class child2 :public base<child2<T>>
{
};
class child3 :public base<child3>//此处基类如果不使用friend,base<child2> 不会报错
{
};
void pf()
{
child3 obj;
obj.test();
}
/
混入
///
//npc属性类
struct npcattr
{
int m_sort; //npc种类:0:代表装饰游戏场景的这种NPC,1:代表商人,卖服装。2:代表把游戏任务派送给玩家。
std::string m_lang; //记录自言自语的一句话
};
//引入玩家属性类:
struct playerattr
{
int m_strength; //力量
int m_agile; //敏捷
int m_constitution; //体质
};
template <typename...T>
class role : public T... //把传入的模板参数当做该类模板的父类
{
public:
role() : T()..., m_attack(0.0), m_defence(0.0), m_life(100.0) {}//初始时攻击力防御力都为0,血量100;
role(double att, double def, double life) : T()..., m_attack(att), m_defence(def), m_life(life) {}
public:
double m_attack; //攻击力
double m_defence; //防御力
double m_life; //血量
};
template <typename...T>
class family
{
public:
vector< role<T...> > m_members;
//....其他信息
};
//把传入的模板参数当做该类模板的父类, 能减少代码量
using role_npc = role<npcattr>;
using role_player = role<playerattr>;
using role_mixnpc = role<npcattr,playerattr>; //通过混入技术方便的组合,自由的装配各种功能
using family_npc = family<npcattr>;
///
如上, 可发现
如果传入的的模板参数中有虚函数的话, 并且role中也有一个与虚函数同名的函数, 那么同样也是多态的表现;
如下:
template <typename ... T>
class Base :public T...
{
public:
void myfunc()
{
cout << "Base::myfunc()执行了!" << endl;
}
};
template <typename ... T>
class Derived :public Base<T...>
{
public:
void myfunc() //virtual
{
cout << "Derived::myfunc()执行了!" << endl;
}
};
class A
{
};
class AVir
{
public:
virtual void myfunc() {}
};
void pf()
{
Base<AVir>* pb2 = new Derived<AVir>; //父类指针指向子类对象
pb2->myfunc();
}