设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例

设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例

方式一:把构造函数声明为私有函数(该方法创建的类只能在堆上创建实例)

在C#中有关键字sealed,在Java中有关键字final它们修饰的类不能被继承
在C++中我们知道,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数,所以我们可以把父类的构造函数和析构函数定义为私有函数
同时我们可以定义两个公有的静态函数来创建对象和释放对象,以达到创建实例的目的

class A
{
public:
      static A* GetA()
      {
            return new A();
      }
      static void DeleteA(A* a)
      {
            delete a;
      }
private:
      A(){}
      ~A(){}
};
方式二:利用虚拟继承

B类使用起来和其它的类型没有什么区别,可以在堆上也可以在栈上创建实例。因为B类是A< B >类的友元类型,所以可以调用它的私有函数
但如果想从B类继承一个类的话,由于B 类是由A< B >类虚拟继承来的,所以就会跳过B类直接调用A< B >类的构造函数,而别的类并不是A< B >的友元类型所以不能调用

template 
class A
{
      friend T;
private:
      A(){}
      ~A(){}
};
class B :virtual public A
{
public:
      B(){}
      ~B(){}
};
只能在栈上创建实例:

只有使用new运算符,才会在堆上创建实例,只要禁用new运算符就可以保证只在栈上创建实例

class B
{
public:
      B(){}
      ~B(){}
private:
      void *operator new(size_t t){}
      void operator delete(void *ptr){}
};

你可能感兴趣的:(面试题)