您的位置:首页 > 编程语言 > C语言/C++

用C++设计一个不能被继承的类

2013-08-18 23:10 351 查看
在C#中定义了关键字sealed,被sealed修饰的类不能被继承。在Java中同样也有关键字final表示一个类型不能被继承。在C++中没有类似于sealed和final的关键字,所以我们只有自己来实现。

      很多人都能够想到,类的构造函数和析构函数是关键。因为子类的构造函数会自动调用父类的构造函数。子类的析构函数也会自动调用父类的析构函数。所以要想使一个类不能被继承,只有把它的构造函数和析构函数都定义为私有函数或保护函数,那么当一个类试图从这个类继承的时候,必然会先调用构造函数而产生编译错误,从而导致继承失败。

      这个不能被继承类的构造函数和析构函数都是私有函数,那么怎样才能得到该类的实例呢? 这倒不难,可以通过定义公有的静态函数来创建和释放类的实例,实现该类不能被继承但能被实例化的功能。

      基于这个思路,我们可以写出如下代码:

[cpp] view
plaincopy

#include<iostream>  

using namespace std;  

  

class SealedClass  

{  

private:                      // 私有成员  

    SealedClass() {  };       // 构造函数  

    ~SealedClass() {  };      // 析构函数  

public:  

    int m_number;  

    static SealedClass* GetInstance(int number)              // 用于构造的函数  

    {  

        SealedClass * pInstance = new SealedClass();  

        pInstance->m_number = number;  

        return pInstance;  

    }  

    static void DeleteInstance(SealedClass* pInstance)       // 用于析构的函数  

    {  

        delete pInstance;  

        pInstance = 0;  

    }  

};  

  

int main(void)  

{  

    SealedClass * p = SealedClass::GetInstance(9);  

    cout<<"m_number is : "<<p->m_number<<endl;  

    SealedClass::DeleteInstance(p);  

    cout<<"m_number is : "<<p->m_number<<endl;  

      

    return 0;  

}  

输出结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: