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() {}
};