C#和Java都提供了一种机制让一个类不能被继承,如C#中的sealed关键字和Java的final关键字,然而C++程序员就没这么好命了.不过C++也可以模拟出这种效果,原理基于:子类的构造函数会自动调用父类的构造函数,同理析构函数也是一样.如果父类的构造函数和析构函数被设为私有的话,那么子类就无法调用,也就达到了父类不可被继承的目的了。原理很简单,按此原理我也实作出一个自认为很实用的工具类,在此献下丑,欢迎大家批评:

template< typename TDerive, typename TProvider >
class  CFobidDeriveProviderBase
{
    friend TDerive;
    friend TProvider;
    
private:
    CFobidDeriveProviderBase(){}
    ~CFobidDeriveProviderBase(){}
};

/*
* 提供禁止派生的功能,需要此功能的类可以从CFobidDeriveProvider派生,并将类名作为模板参数传递
*/
template< typename TDerive >
class  CFobidDeriveProvider : virtual public CFobidDeriveProviderBase< TDerive, CFobidDeriveProvider<TDerive>>
{
public:
    CFobidDeriveProvider(){}
    ~CFobidDeriveProvider(){}
};

/*
* 测试类,该类不可被继承
*/
class  CNoDerive : public CFobidDeriveProvider< CNoDerive >
{
public:
    CNoDerive(){}
    ~CNoDerive(){}

void  Alert()
    {
        AtlMessageBox( NULL, _T("Alert") );
    }
};

之所以将继承的结构分为2层:CFobidDeriveProvider和CFobidDeriveProviderBase,主要是方便使用,用户只需直接从CFobidDeriveProvider派生就可实现一个不可被继承的类,而不需要虚拟继承。

若有类从CNoDerive派生:

class  CSomeDerive : public CNoDerive
{
public:
    CSomeDerive(){}
    ~CSomeDerive(){}
};

CSomeDerive的构造函数调用过程如下:由于CFobidDeriveProvider是从CFobidDeriveProviderBase虚拟派生,在虚继承出现的继承层次中,总是在构造非虚基类之前构造虚基类,因而会跳过CNoDerive和CFobidDeriveProvider的构造函数而直接调用CFobidDeriveProviderBase的构造函数,但CSomeDerive不是CFobidDeriveProviderBase的友元,因此也无法调用CFobidDeriveProviderBase的私有构造函数.故而编译错误.

最新文章

  1. ZOJ 3705 Applications 模拟
  2. JVM垃圾收集器介绍
  3. [转]virtualenv and virtualenvwrapper
  4. yii
  5. 将listBox中信息显示在dataGridview中,操作datagridview后删除listBox信息和SQL数据库信息 续(浅谈listBox..)
  6. freemarker常用的基本命令
  7. ubuntu 10.10配置NFS网络共享步骤
  8. 实现Android语音识别服务接口 RecognitionService的方法
  9. C语言声明解析方法
  10. Arduino 各种模块篇 摇杆模块
  11. 开启真机的View Server引入HierarchyViewer/By写monkeyrunner自动化测试脚本
  12. Charles篡改请求,在手机上抓包,以及弱网设置
  13. flask与数据库连接相关操作
  14. LINUX 中实现逻辑卷、自动挂载
  15. SpringBoot document notes
  16. 目录遍历漏洞简介 转载于h3c
  17. mysql:InnoDB行/表级锁实现/事务
  18. k8s本地搭建相信步骤
  19. combogrid获取多个字段的方法
  20. 29Spring_Autowriter的一些疑惑(很重要)

热门文章

  1. cannot import name &#39;_imaging&#39; 报错
  2. 关于条件约束问题的无偏差统计——一个偏差控制型生成器(Unbiased Statistics of a Constraint Satisfaction Problem – a Controlled-Bias Generator——by Denis Berthier)
  3. 20145234黄斐《Java程序设计》第六周学习总结
  4. BZOJ1053_反素数_KEY
  5. .net core 中后台获取前台 数据(post)的方法
  6. MySQL高级-慢查询日志
  7. JAVA Map 之元素定位,冲突碰撞
  8. linux 学习总结---- mysql 总结
  9. 关于javascript的一个小问题,请问有人看出啥问题吗?
  10. 孤荷凌寒自学python第七十七天开始写Python的第一个爬虫7