博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 中如何设计 final 类
阅读量:6818 次
发布时间:2019-06-26

本文共 1688 字,大约阅读时间需要 5 分钟。

hot3.png

      在 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	template
class 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

 

转载于:https://my.oschina.net/u/568966/blog/309565

你可能感兴趣的文章
React 源码剖析系列 - 不可思议的 react diff
查看>>
走近抽象类与抽象方法
查看>>
4. 寻找两个有序数组的中位数
查看>>
React组件开发总结
查看>>
各种符号
查看>>
大道至简,职场上做人做事做管理
查看>>
抗干扰的秘诀:分类、整理与专注
查看>>
Number of Connected Components in an Undirected Graph
查看>>
BZOJ 3143 游走(高斯消元)
查看>>
SpringBoot 配置文件存放位置及读取顺序
查看>>
min.js格式化工具
查看>>
《软件工程-理论、方法与实践》读书笔记一
查看>>
POJ Problem Radar Installation 【贪心】
查看>>
redis 持久化方式
查看>>
Vue2.0设置反向代理解决跨域问题
查看>>
伪类link,hover,active,visited,focus的区别
查看>>
WTL 实践笔记
查看>>
漫谈C++:良好的编程习惯与编程要点(转载)
查看>>
Jquery plugin ScrollUp使用和实现
查看>>
使用HTML5 FormData对象实现大文件分块上传(断点上传)功能
查看>>