C++ 中如何设计 final 类

      在 Java 等语言中有一个关键字:final,该关键字专门用于禁止类继承的功能,而在以往的C++中却没有此关键字(据说最新的 C++ 规范增加了此关键字,但还未普及),在 acl_cpp 库中通过模板方式设计了 final 类的功能,下面是一个例子:

 

#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 通用);当然,还有其它方法实现禁止类继承的方式,但不如上述方法通用。

       acl::final_tpl 模板类的源码如下:

 

#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/

      github: https://github.com/acl-dev/acl

      更多文章:http://zsxxsz.iteye.com/

      QQ 群:242722074

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值