C++实现不能继承的类
实现一个不能继承的类,这在Java等语言中是很好实现的,被final关键字修饰的类不能被继承。
C++中没有类似的关键字,须自己实现。一般有如下两种方法:
1、设置构造方法与析构方法为私有
class FinalClass
{
public:
static FinalClass * GetInstance()
{
return new FinalClass();
}
static void DestoryInstance(FinalClass *pClass)
{
delete pClass;
}
private:
FinalClass()
{ }
virtual ~FinalClass()
{ }
};
由于定义构造方法与析构方法为私有,所以必须定义static方法来创建和释放类的实例。
该方法的缺点:创建类的实例不方便,而且之间在堆上创建实例,而得不到栈上的实例。
2、使用虚拟继承实现
template <typename T> class MakeFinal
{
public:
friend T;
private:
MakeFinal()
{
}
virtual ~MakeFinal()
{
}
}; class FinalClass2 : virtual public MakeFinal<FinalClass2>
{
public: FinalClass2()
{
}
virtual ~FinalClass2()
{
}
};
这样实现的话,FinalClass2就不能被继承,如果继承该类就会导致编译不过。而且可以像使用普通类一样来使用该类,可以在栈与堆上创建实例。
C++实现不能继承的类的更多相关文章
- 窥探Swift之类的继承与类的访问权限
上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...
- 继承Thread类
Thread类在包java.lang中,从这个类中实例化的对象代表线程,启动一个新线程需要建立Thread实例,Thread类中常用的两个构造方法如下: (1)public Thread(String ...
- C++中虚继承派生类构造函数的正确写法
最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...
- C#中是否可以继承String类
C#中是否可以继承String类? 答:String类是sealed类故不可以继承. 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 HoverTree ...
- Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- Java通过继承thread类与实现Runnable接口实现多线程的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 一.通过继承T ...
- Java中是否可以继承String类,为什么
Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...
- [Effective JavaScript 笔记]第40条:避免继承标准类
ECMAScript标准库里配备了许多重要的类,如Array,function,以及Date等.扩展这些类生成子类可以方便完成很多工作,但它们的定义具有很多特殊的行为,所以很难写出行为正确的类. Ar ...
- 是否可以继承String类?
是否可以继承String类? String类是final类故不可以继承
- 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?
接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 1. 接口可以继承接口. 2. 抽像类可以实现(implements)接 ...
随机推荐
- jQuery补充,模拟图片放大镜
jQuery补充,模拟图片放大镜 html <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- xsocket:空闲超时问题。
XSocket是什么? java的nio的封装. 详情: 1. http://xsocket.sourceforge.net/core/apidocs/2_1/index.html 2. http:/ ...
- win7下cmake编译opencv2.3.1生成opencv—createsamples.exe和opencv_haartrainingd.exe
第一步:下载安装cmake,之后进行默认安装即可,这步略过. 第二步:配置cmake ,使cmake找到opencv进行编译安装 watermark/2/text/aHR0cDovL2Jsb2cuY3 ...
- HDU 1284 钱币兑换问题(全然背包:入门题)
HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...
- 使用 Estimator 构建卷积神经网络
来源于:https://tensorflow.google.cn/tutorials/estimators/cnn 强烈建议前往学习 tf.layers 模块提供一个可用于轻松构建神经网络的高级 AP ...
- 权限模块_使用权限_实现主页面的效果_显示左侧菜单&只显示有权限的菜单项
权限模块__使用权限__实现主页面的效果 HomeAction.java public class HomeAction extends ActionSupport { public String i ...
- WebService远程调用(命令行调用)
远程调用webservice 方法, 通过wsdl命令,生成webservice 对应asmx 文件的对应类(cs文件),然后将此cs文件引用到当前项目中,项目其他地方需要调用webservice方法 ...
- JZOJ.5307【NOIP2017模拟8.18】偷窃
Description
- js文章收藏
js文件被浏览器缓存的问题:http://www.cnblogs.com/wangtao_20/p/4589898.html
- Cocos2d-x学习笔记之常用的宏
NS_CC_BEGIN:Cocos2D-x命名空间开始,属于Cocos2D-x的类的定义以该宏开头,用以代替C++中的“namespace cocos2d{”. NS_CC_END:Cocos2D-x ...