面试:C++不可继承类

  面试中可能遇到让设计一个没法被继承的类。最简单的实现是将该类的构造函数设置为私有的,而后经过静态成员函数调用私有构造函数实例化对象,这样的类确实不可继承,可是使用起来很是不方便,必须使用静态成员实例化对象,并且对象存储在堆中,没法像一个普通的类同样的被使用。最佳的设计是结合私有构造函、友元、虚拟继承实现。面试

1、简单实现

 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 };

2、最佳实现

 1 template<typename T>
 2 class NoneInherit {
 3     friend T;
 4 private:
 5     NoneInherit() {
 6     }
 7     ~NoneInherit() {
 8     }
 9 };
10 
11 class Finalclass: virtual public NoneInherit<Finalclass> {
12 public:
13     Finalclass() {
14     }
15     ~Finalclass() {
16     }
17 };
18 
19 //class TestClass: public Finalclass {
20 //};

关键点:函数

  1. 模板类NoneInherit类,构造函数和析构函数都设置为私有,模板参数T设置为友元,这样友元类能够调用构造函数。例如FinalClass是NoneInherit的友元类,能够使用基类的私有构造函数和析构函数
  2. 虚拟继承virtual是最关键的点。若是继承时去掉virtual,FinalClass仍是能够被继承的,那么为何须要使用虚拟继承呢?由于在普通继承中,每一个类只是初始化本身的直接的基类。那意味着,若是不使用virtual,TestClass继承Finalclass,由FinalClass再去调用NoneInherit类,因为FinalClass是NoneInHerit的基类,所以整个继承没有任何问题。因为FinalClass使用了虚拟继承,在建立TestClass的时候,TestClass类的构造函数要负责虚基类NoneInherit类的构造,而NoneInherit的构造函数是私有的,友元关系也没法继承,所以TestClass类没有访问的权限。
相关文章
相关标签/搜索