用C++设计一个不能被继承的类
2011-06-17 11:05
323 查看
在C#中定义了关键字sealed,被sealed修饰的类不能被继承。在Java中同样也有关键字final表示一个类型不能被继承。在C++中没有类似于sealed和final的关键字,所以我们只有自己来实现。
很多人都能够想到,类的构造函数和析构函数是关键。因为子类的构造函数会自动调用父类的构造函数。子类的析构函数也会自动调用父类的析构函数。所以要想使一个类不能被继承,只有把它的构造函数和析构函数都定义为私有函数或保护函数,那么当一个类试图从这个类继承的时候,必然会先调用构造函数而产生编译错误,从而导致继承失败。
这个不能被继承类的构造函数和析构函数都是私有函数,那么怎样才能得到该类的实例呢? 这倒不难,可以通过定义公有的静态函数来创建和释放类的实例,实现该类不能被继承但能被实例化的功能。
基于这个思路,我们可以写出如下代码:
很多人都能够想到,类的构造函数和析构函数是关键。因为子类的构造函数会自动调用父类的构造函数。子类的析构函数也会自动调用父类的析构函数。所以要想使一个类不能被继承,只有把它的构造函数和析构函数都定义为私有函数或保护函数,那么当一个类试图从这个类继承的时候,必然会先调用构造函数而产生编译错误,从而导致继承失败。
这个不能被继承类的构造函数和析构函数都是私有函数,那么怎样才能得到该类的实例呢? 这倒不难,可以通过定义公有的静态函数来创建和释放类的实例,实现该类不能被继承但能被实例化的功能。
基于这个思路,我们可以写出如下代码:
#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; }输出结果如下:
相关文章推荐
- 用c++设计一个类,这个类只能被实例化3次,且不能被继承
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 面试题48:用C++设计一个不能被继承的类
- c++设计一个不能被继承的类,为什么必须是虚继承?原因分析
- 用c++设计一个不能被继承的类
- 用C++设计一个不能被继承的类(转)
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- C++设计一个真正不能被继承的类
- c++设计一个类,但是不能被继承
- 用C++设计一个不能被继承的类
- 用 C++ 设计一个不能被继承的类
- 用 C++ 设计一个不能被继承的类
- 剑指offer——面试题48:用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类