使用c++完成一个不被继承的类

来源:互联网 发布:java poi word 编辑:程序博客网 时间:2024/06/15 23:17

在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的构造函数是私有的,因此不能完成实例化。