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