不能被继承的类

方法一

C++中子类的构造函数和虚构函数会调用父类的构造和虚构函数,所以将父类构造函数和虚构函数定义为私有函数,子类不能继承私有函数,那么子类继承时将会出错。

类的构造函数和虚构函数定义为私有函数,怎样的到该类型的实例呢?通过公有的静态函数来创建和释放实例,直接通过类SeadledClass1::GetInstance()访问。但得到的实例在堆上,而不是在栈上。

class SealedClass1

{

public:

         static  SealedClass1 *GetInstance()

         {

                return new SealedClass1();           //new分配的是堆上的空间

          } 

       static void DeleteInstance(SealedClass1 *pInstance)

      {

             delete pInstance;

       }

private:

       SealedClass1(){}

       ~SealedClass1(){}

};

方法二

如果有子类继承Sealedclass2类,那么会调用MakeSealed的构造函数和析构函数而出错,因为该子类不是MakeSealed的友元,所以Sealedclass2类不能被继承,同时Sealedclass2是MakeSealed的友元,所以Sealedclass2可以调用MakeSealed的构造函数和析构函数实例化。可以在栈上也可以在堆上建立实例。注意:GCC还不支持模板参数类型作为友元类型。

template <typename T> class MakeSealed

{

           friend T;

private:

          MakeSealed(){}

         ~MakeSealed(){}

};

class Sealedclass2:virtual public MakeSealed<Sealedclass2>

{

public:

           Sealedclass2(){}

           ~Sealedclass2(){}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值