剑指offer面试题目:不能被继承的类
来源:互联网 发布:什么是源码 编辑:程序博客网 时间:2024/06/10 17:21
题目
用C++写一个不能被继承的类,且能正常使用。
分析
首先,不能被继承的类,也就是它的子类继承它后不能正常的实例化。其实,如果能考虑到这里,就很简单了:子类需要实例化父类,将父类的构造函数设为private,子类就无法实例化了。再进一步,子类的析构函数需要调用父类的析构函数,所以将父类的析构函数设为private也能解决我们的问题。
问题的后半句将难度提升了两个数量级:且能正常使用。如果将父类的构造函数设为private,它自己就无法正常,它自己的对象没法正常的声明、实例化。将构造函数设为了private非常的像单例模式,促使我们想通过friend函数解决无法实例化的问题(当然,如果析构函数是private就是无法释放,它们同样的原理,下文不再复述)。
哦,不不,停住,仔细看题目需求,这里要求正常的使用该类,而不是依靠额外的函数途径去申请一个实例。
这确实是一个难题~如果没有看过答案,我肯定想不出来。我记得计算机世界有一句名言”一切难题都可以通过增加一个中间层去解决“
要正常的使用该类,它的构造函数和析构函数必然是public访问权限。我们为它增加一个虚继承的父类,它是父类的friend(友元),父类的构造函数是private。
代码
class A;class final{ friend class A;//class关键字不可省略,否则在g++中不能编译通过 final() {}};class A : virtual public final{public: A(){}};class B : public A{public: B() { }};/*class A 是final的friend,所以A可以调用final的构造函数。因为A虚继承了final,往后所有继承A的子类,都必须自己实例化final,以保证final在对象中的唯一性所以,B继承A后,需要自己调用虚继承的父类final的构造函数。显然,B不是final的友元,不能访问private中的构造函数。*/
阅读全文
0 0
- 剑指offer面试题目:不能被继承的类
- [剑指offer][面试题48]不能被继承的类
- 剑指offer 6.5 发散思维 - 不能被继承的类
- 剑指offer——不能被继承的类
- 剑指offer 48-不能被继承的类
- 剑指Offer——不能被继承的类
- 【面试题】剑指Offer-48-不能被继承的类
- 剑指offer 面试题48 不能被继承的类
- 【剑指offer】题48:不能被继承的类
- 算法题目---不能被继承的类
- 剑指offer 48---设计一个类不能被继承
- 剑指offer面试题48C++写一个不能被继承的类
- 剑指offer面试题48 C++写一个不能被继承的类
- 《剑指Offer》学习笔记--面试题48:不能被继承的类
- 【剑指offer】6.5发散思维能力——面试题48:不能被继承的类
- 【剑指 offer】(48)—— 不能被继承的类
- 剑指offer面试题 不用加减乘除做加法&&不能被继承的类
- 《剑指offer》:[48]不能被继承的类-单例模式
- 排序程序总结
- Quadtree plus binary tree (QTBT) block structure
- Windows文件检索、复制工具(Python Tkinter)
- C# 详解反射
- STL的使用方法(很全)
- 剑指offer面试题目:不能被继承的类
- PCIe学习笔记(31)--- PL-Logical (Gen 1 and Gen 2) --- (3)
- leetcode --100. Same Tree
- Linux下使用docker搭建STF(踩坑成功)
- hover改变子标签/同级标签样式
- 测试技能图谱
- [Muduo网络库源码分析] (11) base/Types.h_基本类型声明
- 8月1日做题跌坑记录---详解来自维基百科
- SVN安装配置