在c#中要完成一个不被继承的类直接使用关键字sealed,在java中使用final同样可以完成该功能。在c++中要想完成此功能没有相应的关键字,但可以通过将此类的构造函数和析构函数设为private,这样,当继承该类的时候,由于子类需要先调用基类的构造函数,这样将发生错误。但此时实例化基类也出现了问题,因此,要完成实例化,则需要在类中申明一个公有的静态成员函数,使用此函数来完成该类的实例化。代码如下:
class SealedClass{
public:
static SealedClass *getInstance(){
return new SealedClass();
}
static void deleteInstance(SealedClass *pInstance){
delete pInstance;
}
private:
SealedClass(){};
~SealedClass(){};
}
虽然上述代码能够完成基本功能,但要完成此类的实例化还得通过一个静态函数,以下将介绍一种更加新颖的设计方式,使用模板和友类,代码如下:
template <class T>
class SealedClass1{
friend T;
private:
SealedClass1(){
cout<<"SealedClass1 construct"<<endl;
}
~SealedClass1(){
cout<<"SealedClass1 destruct"<<endl;
}
};
class SealedClass2:virtual public SealedClass1<SealedClass2>{
public:
SealedClass2(){
cout<<"SealedClass2 construct"<<endl;
}
~SealedClass2(){
cout<<"SealedClass2 destruct"<<endl;
}
};
class Try:public SealedClass2{
public:
Try();
~Try();
};
当实例化SealedClass2,由于SealedClass2是类SealedClass1的友类,因此,在SealedClass2中的构造函数和析构函数能够调用SealedClass1的构造函数,因此能够完成实例化,但当使用Try继承SealedClass2时,由于SealedClass2是SealedClass1的虚继承,因此实例化try的时候将跳过SealedClass2,直接调用SealedClass1的构造函数,但是Try不是SealedClass1的友类,而SealedClass1的构造函数是私有的,因此不能完成实例化。