为什么要做这么多:
dynamic composable system
compiler-independent
1:类的声明和实现的分离
在h中定义接口,在CPP中定义实现
2:仅向用户暴露接口
在h中定义基类,仅包含纯虚函数声明,同时提供virtual destroy()方法而不把析构函数声明为虚;
同时声明创建子类的方法,并返回基类指针;
3:运行时多态
由于接口和实现的完全分离,同样一套接口可以有不同的实现,可以在调用的时候根据参数判断导入哪一个DLL
4:类的扩展
方法一通过对原有接口的继承,为防止新接口对旧实现的调用而出错,使用RTTI来判断具体实现对象的类型(i.e. dynamic_cast< derived * >( base * ) )
由于dynamic_cast<>是一个编译器依赖的方法,大家对它的实现可能不完全相同,而我们使用虚基类作为接口就是为了编译器无关这个目的,那么使用它将会破坏这个封装。那么需要自己实现RTTI,每个类都必须手动写RTTI的实现,
5: 公有虚接口
既然大家都要用到诸如dynamic_cast和delete等虚接口,那么把它们抽出来做为一个最基本的基类
6:引用计数功能的加入
由于使用了多继承,在创建和删除对象的时候可能会使的客户代码变得复杂,所以加入一个引用计数,每个指针的delete会使计数器减1,当计数为0的时候对象将被自动析构,同样的,指针在被复制的时候需要对引用计数器加1