面试题:C++实现一个不能被继承的类
来源:互联网 发布:html商城模板源码 编辑:程序博客网 时间:2024/06/05 08:28
一个子类继承一个父类,子类的构造函数和析构函数会自动调用父类的构造函数,
先要求设计不能继承的类,即不允许子类的构造函数调用父类的构造函数和析构函数,方法如下:
1.直接的方法:将父类的构造函数和析构函数设置为private成员函数
私有成员只能被自身的类访问
class A{public: static A* Create() { return new A(); } static void Delete(A* p) { delete p; }private: A(){} ~A(){}};class B:public A{public: B(){} ~B(){}};int main(){ //B b; //A a; A* p = A::Create(); A::Delete(p); getchar(); return 0;}
例中类B 就不能访问类A,因为A的构造函数和析构函数定义为private成员,但是此时类A定义A类实例时会发生错误,怎样才能的到该类型的实例呢?我们可以通过公有的静态函数和创建和释放该类的实例,即上述的 static A* Create()和static void Delete(A* p)函数。
该方法的缺点:
- 该类的实例只能在堆上创建
- 与我们常见的类的构造与析构不同
2.利用虚继承
首先,我们先来复习一下虚继承
在我们学习菱形继承的时候,我们知道在一个类中保留间接共同基类的多份同名成员,这种现象造成的问题是保留多份数据成员的拷贝,浪费空间,且访问该成员是容易出错;为了解决该问题,我们提出了虚继承的学习。
虚继承,使得在继承间接共同基类时只保留一份成员
规定:C++编译系统只执行最后的派生类对基类的构造函数的调用,而忽略基类的其他派生类对虚基类的构造函数的调用
template<class T>class makeSealed{public: friend T;private: makeSealed(){} ~makeSealed(){}};class SealedClass:virtual public makeSealed<SealedClass>{public: SealedClass(){} ~SealedClass(){}};class A :public SealedClass{public: A(){} ~A(){}};int main(){ A a; SealedClass s; getchar(); return 0;}
类SealedClass虚继承类makeSealed,此时将makeSealed类的构造函数和析构函数设置为私有成员函数,而Sealed为makeSealed类的友元函数,可以访问该类;
此时,若我们定义一个类A继承SealedClass类,类A将会跳过SealedClass类的构造函数直接去访问类makeSealed的构造函数,但类makeSealed的构造函数是私有成员,不能访问,故SealedClass不能被继承。
该方法的优点:
- 类的实例既可以在堆上创建,又可以在栈上创建;
- 更符合类的表示
- 面试题:C++实现一个不能被继承的类
- 试题:实现一个不能被继承的类(上)
- 试题:实现一个不能被继承的类(下)
- 试题:实现一个不能被继承的类(续之下)
- 试题:实现一个不能被继承的类(续之上)
- 程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]
- 程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]
- 程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]
- 剑指offer面试题48C++写一个不能被继承的类
- 剑指offer面试题48 C++写一个不能被继承的类
- 剑指offer——面试题48:用C++设计一个不能被继承的类
- 【c++】实现一个不能被继承的类
- - 。-创建不能被继承的类 一道面试题
- [剑指offer][面试题48]不能被继承的类
- 面试题48:不能被继承的类
- 面试题52:不能被继承的类
- 【面试题】剑指Offer-48-不能被继承的类
- 剑指offer 面试题48 不能被继承的类
- Android Git 笔记
- Android实现可左右滑动的选择控件
- java导出jar包以及jar内程序读取jar包外配置文件
- Win7下安装Python和Python IDLE
- npm常用命令整理
- 面试题:C++实现一个不能被继承的类
- 第3章 视图
- 2.ARKit 的工作流程
- Tuxera NTFS for Mac 2017
- iOS socket原理 ~详解
- LeetCode-16:3Sum Closest
- 矩阵快速幂
- Bootstrap中缩略图
- codeforces 830C Bamboo Partition