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

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

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

在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 T>
class A
{
      friend T;
private:
      A(){}
      ~A(){}
};
class B :virtual public A<B>
{
public:
      B(){}
      ~B(){}
};
只能在栈上创建实例:

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

class B
{
public:
      B(){}
      ~B(){}
private:
      void *operator new(size_t t){}
      void operator delete(void *ptr){}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值