用C++设计一个不能被继承的类
来源:互联网 发布:网络劫持举报 编辑:程序博客网 时间:2024/06/03 14:57
在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++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++ 设计一个不能被继承的类
- [转]用C++ 设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 用C++ 设计一个不能被继承的类。
- 用 C++ 设计一个不能被继承的类
- 用C++设计一个不能被继承的类
- 专业图表绘制
- “人”之为人:道德+技能+创新
- A10 平板开发一硬件平台搭建
- C++ 模板
- 填报表下拉框动态过滤
- 用C++设计一个不能被继承的类
- 黑马程序员_内部类
- 限量抢购功能的实现
- 软件项目质量保证——编码规范
- Java基础<八>--->包,导入
- 04(设计)什么是MVC模式
- UVa 1394: And Then There Was One
- 关于正则表达式1
- Struts1与Struts2原理 区别 详解 汇总