原理:
1、工具类就是一个配件,如果使用的类需要装配该工具类,就通过继承的方式继承填入了本类的工具类,实现虚函数的功能
2、工具类作为模板类,如果不传入使用类,无法实例化,因此必须传入使用类
3、工具类有一个函数,该函数使用static_cast将this指针指向的内存按照使用类的形式表达,要注意,不使用dynamic_cast是因为基类转派生类动态转化会返回空指针
4、使用类需要按照自己的需求,来判断要不要实现工具类要求实现的函数,如果实现了指定的函数,那么就能调用,没有实现就调用工具类提供的函数
装配模式优点:
1、直接用虚函数表需要大量空间存储虚函数表,速度慢,比如MFC中的类大量使用虚函数,使得MFC并不适合大型软件界面的开发
2、使用装配模式能节省很多虚函数表的空间
template<class T>
class Edoyun {
public:
void show() {
//本类强制转换为T*,用static_cast是因为基类转派生类用dynamic_cast会返回空指针
T* p = static_cast<T*>(this);
//如果类T实现了Name,那么调用类T的,如果没有调用本类的
p->Name();
}
protected:
void Name() { std::cout << "Edoyun" << std::endl; }
};
class Sub :public Edoyun<Sub> {
public:
void Name() { std::cout << "Sub" << std::endl; }
};
class Sub2 :public Edoyun<Sub2> {};
Sub sub;
Sub2 sub2;
sub.show();//Sub
sub2.show();//Edoyun