用C++实现不能被继承的类

C++中没有自己定义这样一个类,需要自己实现。

(1)将构造函数设为私有

不能被继承,则可以将构造函数和析构函数定义为private,这样有个问题,我们也不能新建一个此类的变量。

可以使用static来新建和释放内存。如下示例:

class SealedClass0
{
public:
    static SealedClass0* GetInstance() 
    {
        return new SealedClass0();
    }
 
    static void DeleteInstance( SealedClass0* pInstance)
    {
        delete pInstance;
    }
 
private:
    SealedClass0() {}
    ~SealedClass0() {}
};

(2)使用虚拟继承和友元

将一个类A的构造析构函数定义为private;

定义子类B是A的友元;

子类B虚拟继承(virtual public)A;

这样定义的效果是可以创建B的实例但是不能被继承,如果被子类C继承,则C会跳过B自己来创建A,而C不能访问A的构造和析构函数;

如果不采用虚拟继承,public时,C类会构造B,B类来创建A,此时B是可以被继承的。

class SealedClass1;
class MakeSealed1
{
	friend SealedClass1;

private:
	MakeSealed1() {}
	~MakeSealed1() {}
};

class SealedClass1 : virtual public MakeSealed1
{
public:
	SealedClass1() {}
	~SealedClass1() {}
};

也可以采用模板的方式如下:

template <typename T> class MakeSealed
{
    friend T;
 
private:
    MakeSealed() {}
    ~MakeSealed() {}
};
 
class SealedClass2 : virtual public MakeSealed<SealedClass2>
{
public:
    SealedClass2() {}
    ~SealedClass2() {}
};


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值