在 Java 等語言中有一個關鍵字:final,該關鍵字專門用於禁止類繼承的功能,而在以往的C++中卻沒有此關鍵字(聽說最新的 C++ 規範增長了此關鍵字,但還未普及),在 acl_cpp 庫中經過模板方式設計了 final 類的功能,下面是一個例子:ide
#include "stdafx.h" #include <stdio.h> #include "final_tpl.hpp" // 類 CMyFinalClass 禁止被子類繼承 class CMyFinalClass : public acl::final_tpl<CMyFinalClass> { 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 通用);固然,還有其它方法實現禁止類繼承的方式,但不如上述方法通用。spa
acl::final_tpl 模板類的源碼以下:.net
#pragma once namespace acl { #ifdef WIN32 template<typename TDerive, typename TProvider> class final_tpl_base { friend TDerive; friend TProvider; private: final_tpl_base() {} ~final_tpl_base() {} }; #else template <typename T> class identity { public: typedef T me; }; template<typename TDerive, typename TProvider> class final_tpl_base { friend class identity<TDerive>::me; friend class identity<TProvider>::me; private: final_tpl_base() {} ~final_tpl_base() {} }; #endif /* * 提供禁止派生的功能,須要此功能的類能夠從final_tpl派生, * 並將類名做爲模板參數傳遞 * @example: * class my_final_class : public acl::final_tpl <my_final_class> * { * public: * my_final_class() {} * ~my_final_class() {} * } * 這樣就保證了 my_final_class 是不能被繼承的 */ template<typename TFinalClass> class final_tpl : virtual public final_tpl_base<TFinalClass, final_tpl<TFinalClass> > { public: final_tpl() {} ~final_tpl() {} }; }
我的微博:http://weibo.com/zsxxsz設計
acl_cpp 下載:http://sourceforge.net/projects/acl/code
更多文章:http://zsxxsz.iteye.com/blog
QQ 羣:242722074繼承