C++ 中如何設計 final 類

      在 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繼承

相關文章
相關標籤/搜索