探讨C++实现一个不可被继承的类
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派生:
{
public:
CSomeDerive(){}
~CSomeDerive(){}
};
CSomeDerive的构造函数调用过程如下:由于CFobidDeriveProvider是从CFobidDeriveProviderBase虚拟派生,在虚继承出现的继承层次中,总是在构造非虚基类之前构造虚基类,因而会跳过CNoDerive和CFobidDeriveProvider的构造函数而直接调用CFobidDeriveProviderBase的构造函数,但CSomeDerive不是CFobidDeriveProviderBase的友元,因此也无法调用CFobidDeriveProviderBase的私有构造函数.故而编译错误.
最新文章
- ZOJ 3705 Applications 模拟
- JVM垃圾收集器介绍
- [转]virtualenv and virtualenvwrapper
- yii
- 将listBox中信息显示在dataGridview中,操作datagridview后删除listBox信息和SQL数据库信息 续(浅谈listBox..)
- freemarker常用的基本命令
- ubuntu 10.10配置NFS网络共享步骤
- 实现Android语音识别服务接口 RecognitionService的方法
- C语言声明解析方法
- Arduino 各种模块篇 摇杆模块
- 开启真机的View Server引入HierarchyViewer/By写monkeyrunner自动化测试脚本
- Charles篡改请求,在手机上抓包,以及弱网设置
- flask与数据库连接相关操作
- LINUX 中实现逻辑卷、自动挂载
- SpringBoot document notes
- 目录遍历漏洞简介 转载于h3c
- mysql:InnoDB行/表级锁实现/事务
- k8s本地搭建相信步骤
- combogrid获取多个字段的方法
- 29Spring_Autowriter的一些疑惑(很重要)
热门文章
- cannot import name &#39;_imaging&#39; 报错
- 关于条件约束问题的无偏差统计——一个偏差控制型生成器(Unbiased Statistics of a Constraint Satisfaction Problem – a Controlled-Bias Generator——by Denis Berthier)
- 20145234黄斐《Java程序设计》第六周学习总结
- BZOJ1053_反素数_KEY
- .net core 中后台获取前台 数据(post)的方法
- MySQL高级-慢查询日志
- JAVA Map 之元素定位,冲突碰撞
- linux 学习总结---- mysql 总结
- 关于javascript的一个小问题,请问有人看出啥问题吗?
- 孤荷凌寒自学python第七十七天开始写Python的第一个爬虫7