博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【100题】第五十九题 用C++编写不能被继承的类
阅读量:7030 次
发布时间:2019-06-28

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

一,题目

         用C++设计一个不能被继承的类。

二,分析

        

         在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字。

         首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。

 

        可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?

        通过定义静态来创建和释放类的实例。

 

三,实现

        下面是一个单利模式的实现

 

#include 
using namespace std; class Singleton {private: Singleton(); ~Singleton();// {} static Singleton *instance; public: static Singleton* GetInstance() { if(instance == NULL) { instance = new Singleton(); } return instance; } static void DeleteInstance() { if(instance != NULL) { delete instance; } }};Singleton* Singleton::instance=NULL;//一定要初始化(由于不能在方法体内部初始化,所以就放到外部)int main(){ }

 

      这个类是不能被继承,但在总觉得它和一般的类有些不一样,使用起来也有点不方便。比如,我们只能得到位于堆上的实例,而得不到位于栈上实例。

能不能实现一个和一般类除了不能被继承之外其他用法都一样的类呢?办法总是有的,不过需要一些技巧。请看如下代码:

class MakeFinal{      friend FinalClass2;private:      MakeFinal() {}      ~MakeFinal() {}};class FinalClass2 : virtual public MakeFinal{public:      FinalClass2() {}      ~FinalClass2() {}};

 

         这个类使用起来和一般的类没有区别,可以在栈上、也可以在堆上创建实例。尽管类MakeFinal的构造函数和析构函数都是私有的,但由于类FinalClass2是它的友元函数,因此在FinalClass2中调用MakeFinal<FinalClass2>的构造函数和析构函数都不会造成编译错误。

 

        但当我们试图从FinalClass2继承一个类并创建它的实例时,却不同通过编译。

class Try : public FinalClass2
{
public:
      Try() {}
      ~Try() {}
};

Try temp; 

由于类FinalClass2是从类MakeFinal 虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass2而直接调用MakeFinal的构造函数。非常遗憾的是,Try不是MakeFinal的友元,因此不能调用其私有的构造函数。

基于上面的分析,试图从FinalClass2继承的类,一旦实例化,都会导致编译错误,因此是FinalClass2不能被继承。这就满足了我们设计要求。

转载于:https://www.cnblogs.com/secbook/archive/2012/08/23/2654950.html

你可能感兴趣的文章
[MetalKit]21-What's-new-in-graphics-and-games-at-WWDC-2016
查看>>
html2canvas在vue下的巨坑
查看>>
从设计师和开发的角度使用 lottie
查看>>
iOS之自定义tabBar
查看>>
Spring boot学习(三) Spring boot整合mybatis
查看>>
Redux 源码深度解析(附带视频1月14号上传)
查看>>
理解webpack原理,手写一个100行的webpack
查看>>
Node.js & Express 项目基本搭建
查看>>
掌握 MySQL 这 19 个骚操作,效率至少提高3倍
查看>>
【跃迁之路】【744天】程序员高效学习方法论探索系列(实验阶段501-2019.3.6)...
查看>>
用于大数据测试、学习的测试数据
查看>>
Software System Analysis and Design | 1
查看>>
JavaScript函数式编程,真香之组合(一)
查看>>
JavaScript链式调用实例浅析
查看>>
报表没完没了怎么办? | 润乾集算器提效报表开发
查看>>
记一次Hexo迁移
查看>>
RESTful API 中的 Status code 是否要遵守规范
查看>>
第十一天-《企业应用架构模式》-对象-关系行为模式
查看>>
[spring boot] jdbc
查看>>
新的开始!
查看>>