在 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() {}
};
}
acl_cpp 下载:http://sourceforge.net/projects/acl/
QQ 群:242722074