题目:用C++设计一个不能被继承的类

1、不能被继承?按照继承的理论,只要把类的构造函数设为私有,即可解决问题。

此时子类就没有办法访问基类的构造函数,从而就阻止了进行子类构造对象的任务实现,也就达到了不可继承的目的。

问题:如何产生这个类的实例对象和释放对象呢?

2、显然定义静态方法,在方法内部实现一个对象,然后返回它的指针。

Ok?那怎么释放掉呢?再照样设计一个释放内存函数,问题就会迎刃而解。

OK。按照这个逻辑分析。示例代码如下:

#include<iostream>
using  namespace std;class A
{
public:static A * Construct(int  n){A *pa = new A;pa->num = n;cout << "num  is:" << pa->num << endl;return pa;}static void Destruct(A * pIntance){delete  pIntance;pIntance = NULL;}private:A(){}~A(){}public:int num;
};void  main()
{A *f = A::Construct(9);cout << f->num << endl;A::Destruct(f);
}

好了,这个类就这样子。按照理论分析,我们的实践结果也是完全成立的。

但是他有两个缺点:

1)该类的实例只能在堆上创建。(相当于是程序员自己创建的而不是系统创建的)

2)与我们常见的类的构造和析构不同。

3、接下来继续完善之。思路如下:

Base构造/析构函数均私有+FinalClass类声明为Base的友元类+FinalClass虚继承自Base

#include<iostream>
using namespace std;template <typename T>
class Base
{friend T;
private:Base() {}~Base() {}
};class Finalclass : virtual public Base<Finalclass>
{
public:Finalclass() {}~Finalclass() {}
};class TestClass : public Finalclass
{
};void  main()
{Finalclass* p = new Finalclass;  // 堆上对象Finalclass fs;               // 栈上对象
//  TestClass tc;  // 基类构造函数私有,不可以被继承。因此不可以创建栈上对象。system("pause");
}

分析:

(1)Finalclass类继承于Base类,Base为虚基类,因为它是Base的友元,所以,它可以访问基类的私有构造函数,以及析构函数。也就是说,可以创建堆上的对象,并且可以构建栈上的对象。

(2)可否继承?假如它作为一个基类被另一个类继承,编译时是完全可以通过的。这一点没有什么疑问。

但问题就在需要构建对象时:当派生类TestClass在构造对象时,因为是虚继承,所以派生类TestClass的构造函数会直接去调用Base基类的构造函数,而Base的构造函数是私有的。编译错误!

这就是一个真正不能被继承的类。

C++实现一个不能被继承的类相关推荐

  1. c++设计一个不能被继承的类

    摘要:使用友元.私有构造函数.虚继承等方式可以使一个类不能被继承,可是为什么必须是虚继承?背后的原理又是什么? 用C++实现一个不能被继承的类(例1) 1 #include <iostream& ...

  2. 由创建一个不能被继承的类引发的对象模型的思考

    昨天吃饭和宽妹讨论起以前看过的如何创建一个不能被继承的类,具体实现见 http://blog.csdn.net/kuaile123/article/details/21321471 同学提到了第一种方 ...

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

    题目:用C++ 设计一个不能被继承的类. 分析:这是Adobe 公司2007 年校园招聘的最新笔试题.这道题除了考察应聘者的C++ 基本功底外,还能考察反应能力,是一道很好的题目. 在Java 中定义 ...

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

    在C#中定义了关键字sealed,被sealed修饰的类不能被继承.在Java中同样也有关键字final表示一个类型不能被继承.在C++中没有类似于sealed和final的关键字,所以我们只有自己来 ...

  5. 如何定义一个不能被继承的类

    为什么80%的码农都做不了架构师?>>>    class VString{//默认的存取控制方式就是私有VString();VString(char*);VString(strin ...

  6. 实现一个不能被继承的类

    在c++98中,我们将构造函数私有化,这个类将无法被继承 在c++11中提供了final ,final关键字修饰的类为最终类,表明该类不能被继承 //C++98:将构造函数私有化,此类可不被继承 cl ...

  7. 写一个不能被继承的类(友元的不可继承性)

    template<class T> class A { public:friend T; private:A() {}~A() {} };class B:virtual public A& ...

  8. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  9. C++ 中不能被继承的类实现,及从中体现virtual 继承的一个特性

    C++ view第一期中给出了如何实现一个不能被继承的类的方法. 如下: #ifdef NDEBUG #define FINAL_CLASS #else #define FINAL_CLASS : p ...

  10. 【100题】第五十九题 用C++编写不能被继承的类

    一,题目 用C++设计一个不能被继承的类. 二,分析 在Java中定义了关键字final,被final修饰的类不能被继承.但在C++中没有final这个关键字. 首先想到的是在C++ 中,子类的构造函 ...

最新文章

  1. AAAI-19 日程 安排
  2. Mysql HA实现MYSQL的高可用(上)
  3. 一段简单的打印代码(c#)
  4. android10 三星升级计划,Android 10.0(Q OS)系统升级计划Androi
  5. mysql 查询记录成纵向_Mysql中查询(数据库中的)纵向转(查询结果显示为)横向.
  6. JAVA的第一个小程序:Hello world
  7. php强制浏览器不缓存,php强制浏览器不缓存和设置浏览器缓存
  8. 【转】推荐系统算法总结(一)
  9. 项目开发设计文档怎么写,范文。
  10. TFIDF算法Java实现
  11. Java-基础篇-03-【选择语句-循环语句-随机数】
  12. PowerDesigner显示Comment注释
  13. three - 3 - 基础知识(1. three渲染结构,2.对canvas 进行响应式布局,3.让canvas 画布自适应设备分辨率 )
  14. 【转】2023年Java学习路线图-黑马程序员
  15. 算法---DFS和BFS
  16. 天干地支的推算(根据公元纪年的年月日推算干支的年月日)
  17. UI设计需要学会哪些软件?
  18. 字符串String类型 、数组 Array类型
  19. 考研英语二大作文模板/图表作文,英语图表作文这一篇就够了
  20. 20221223英语学习

热门文章

  1. 域用户登录方法在计算机上不被允许,如何解决不能交互式登录的问题
  2. L1-050 倒数第N个字符串 (15 分)—团体程序设计天梯赛
  3. Linux的LCD硬件实现原理和FrameBuffer简介
  4. environment variable is too large 2047
  5. 【做题】agc002D - Stamp Rally——整体二分的技巧
  6. 20180514 ++i和i++
  7. 关于前端惰性加载(jquery_lazyload)的使用和原理分析
  8. BZOJ1013球形空间产生器sphere 高斯消元
  9. jQuery学习之路(1)-选择器
  10. 韩顺平老师的学习方法