用C++设计一个不能被继承的类

 在C#中定义了关键字sealed,被sealed修饰的类不能被继承。在Java中同样也有关键字final表示一个类型不能被继承。在C++中没有类似于sealed和final的关键字,所以我们只有自己来实现。
      很多人都能够想到,类的构造函数和析构函数是关键。因为子类的构造函数会自动调用父类的构造函数。子类的析构函数也会自动调用父类的析构函数。所以要想使一个类不能被继承,只有把它的构造函数和析构函数都定义为私有函数或保护函数,那么当一个类试图从这个类继承的时候,必然会先调用构造函数而产生编译错误,从而导致继承失败
      这个不能被继承类的构造函数和析构函数都是私有函数,那么怎样才能得到该类的实例呢? 这倒不难,可以通过定义公有的静态函数来创建和释放类的实例,实现该类不能被继承但能被实例化的功能
      基于这个思路,我们可以写出如下代码:
[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class SealedClass  
  5. {  
  6. private:                      // 私有成员  
  7.     SealedClass() {  };       // 构造函数  
  8.     ~SealedClass() {  };      // 析构函数  
  9. public:  
  10.     int m_number;  
  11.     static SealedClass* GetInstance(int number)              // 用于构造的函数  
  12.     {  
  13.         SealedClass * pInstance = new SealedClass();  
  14.         pInstance->m_number = number;  
  15.         return pInstance;  
  16.     }  
  17.     static void DeleteInstance(SealedClass* pInstance)       // 用于析构的函数  
  18.     {  
  19.         delete pInstance;  
  20.         pInstance = 0;  
  21.     }  
  22. };  
  23.   
  24. int main(void)  
  25. {  
  26.     SealedClass * p = SealedClass::GetInstance(9);  
  27.     cout<<"m_number is : "<<p->m_number<<endl;  
  28.     SealedClass::DeleteInstance(p);  
  29.     cout<<"m_number is : "<<p->m_number<<endl;  
  30.       
  31.     return 0;  
  32. }  
输出结果如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值