面试:C++不可继承类

论坛 期权论坛 期权     
C语言与C++编程   2019-6-16 21:52   2821   0
作者:wxquare
链接:https://www.cnblogs.com/wxquare/p/7280025.html

面试中可能遇到让设计一个无法被继承的类。最简单的实现是将该类的构造函数设置为私有的,然后通过静态成员函数调用私有构造函数实例化对象,这样的类确实不可继承,但是使用起来非常不方便,必须使用静态成员实例化对象,而且对象存储在堆中,无法像一个普通的类一样的被使用。最佳的设计是结合私有构造函、友元、虚拟继承实现。
[h2]一、简单实现[/h2]
  1. class Simple{
  2. private:
  3.     Simple(){};
  4.     ~Simple(){}
  5. private:
  6.     static Simple* getInstance(){
  7.         return new Simple();
  8.     }
  9.     static void deleteInstance(Simple* instance){
  10.         delete instance;
  11.     }
  12. };
复制代码
[h2]二、最佳实现[/h2]
  1. template
  2. class NoneInherit {
  3.     friend T;
  4. private:
  5.     NoneInherit() {
  6.     }
  7.     ~NoneInherit() {
  8.     }
  9. };
  10. class Finalclass: virtual public NoneInherit {
  11. public:
  12.     Finalclass() {
  13.     }
  14.     ~Finalclass() {
  15.     }
  16. };
  17. //class TestClass: public Finalclass {
  18. //};
复制代码
关键点:

  • 模板类NoneInherit类,构造函数和析构函数都设置为私有,模板参数T设置为友元,这样友元类可以调用构造函数。例如FinalClass是NoneInherit的友元类,可以使用基类的私有构造函数和析构函数
  • 虚拟继承virtual是最关键的点。如果继承时去掉virtual,FinalClass还是可以被继承的,那么为什么需要使用虚拟继承呢?因为在普通继承中,每个类只是初始化自己的直接的基类。那意味着,如果不使用virtual,TestClass继承Finalclass,由FinalClass再去调用NoneInherit类,由于FinalClass是NoneInHerit的基类,因此整个继承没有任何问题。由于FinalClass使用了虚拟继承,在创建TestClass的时候,TestClass类的构造函数要负责虚基类NoneInherit类的构造,而NoneInherit的构造函数是私有的,友元关系也无法继承,因此TestClass类没有访问的权限。

●编号483,输入编号直达本文

●输入m获取文章目录
C语言与C++编程
分享C/C++技术文章
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP