在 Java 等语言中有一个关键字:final,该关键字专门用于禁止类继承的功能,而在以往的C++中却没有此关键字(据说最新的 C++ 规范增加了此关键字,但还未普及),在 acl_cpp 库中通过模板方式设计了 final 类的功能,下面是一个例子:
#include "stdafx.h"#include#include "final_tpl.hpp"// 类 CMyFinalClass 禁止被子类继承class CMyFinalClass : public acl::final_tpl {public: CMyFinalClass(int n) : dummy_(n) {} ~CMyFinalClass() {} void Test() { printf("hello, I'm the final class\n"); }protected:private: int dummy_;};class CMyClass //: CMyFinalClass, 如果 CMyClass 继承 CMyFinalClass 则编译器会报错{public: CMyClass() {} ~CMyClass() {}};int main(void){ CMyFinalClass m(1); m.Test(); printf(">>enter any key to exit ...\n"); getchar(); return 0;}
由上述例子可以看出,如果您希望自己设计的类为 final 类,则只需将自己的类继承模板类 acl::final_tpl 即可(Win32/Linux 通用);当然,还有其它方法实现禁止类继承的方式,但不如上述方法通用。
acl::final_tpl 模板类的源码如下:
#pragma oncenamespace acl{#ifdef WIN32 templateclass final_tpl_base { friend TDerive; friend TProvider; private: final_tpl_base() {} ~final_tpl_base() {} };#else template class identity { public: typedef T me; }; template class final_tpl_base { friend class identity ::me; friend class identity ::me; private: final_tpl_base() {} ~final_tpl_base() {} };#endif /* * 提供禁止派生的功能,需要此功能的类可以从final_tpl派生, * 并将类名作为模板参数传递 * @example: * class my_final_class : public acl::final_tpl * { * public: * my_final_class() {} * ~my_final_class() {} * } * 这样就保证了 my_final_class 是不能被继承的 */ template class final_tpl : virtual public final_tpl_base > { public: final_tpl() {} ~final_tpl() {} };}
个人微博:
acl_cpp 下载:
更多文章:
QQ 群:242722074