定义一个不能被继承的类
来源:互联网 发布:c语言画玫瑰花程序 编辑:程序博客网 时间:2024/05/21 08:45
学习完C++我们知道了,类是可以被继承的,而继承也分为三种就是:public、private、protected。那么我们如何定义一个不能被继承的类呢?
在C++里面子类的构造函数会去调父类的构造函数,而子类的析构函数也会去调父类的析构函数。如果我们想让一个类不能被继承,那么就把它的构造函数和析构函数定义为私有的,这样当一个类去继承时调构造函数和析构函数的时候就会发生编译错误。可是这样又会引发一个新的问题:我们如何去实例化这个类呢?
解决方法:
1、在这个类里面创建一个对象来提供一个静态的接口,返回创建的这个对象。但是在定义类的对象时不太好。
代码如下:
class FinalClass1{public : static FinalClass1* GetInstance()//静态的接口 { return new FinalClass1;//返回这个对象 } static void DeleteInstance( FinalClass1* pInstance) { delete pInstance; pInstance = 0; }private : FinalClass1() {} ~FinalClass1() {}};
这个类是不能被继承的,但是这个类和其它类有不一样的地方。就是这个类只能创建在堆上的实例,却创建不了在栈上的实例。这样就很遗憾,它不能和一般类一样的使用啊,那就是下面这个方法了。
2、我们先声明一个辅助类A,类A把这个类的构造函数声明为私有的,要让类B称为类A 的友元类,还得要B虚继承A。这样别的类就不能继承B了。
现在类C来继承类B,C在初始化的时候会去调用B的构造函数,但是B虚继承A。为了防止产生二义性,C必须先调用A的构造函数,但是A的构造函数是私有的不能去访问,所以产生错误,继承就失败。
代码如下:
class B; //设计一个不能被继承的类 class A { friend B; private: A() {} }; class B :virtual public A //B虚继承A{ public: B(int b) { _b = b; } void Display() { cout << _b << endl; } private: int _b; }; class D:public B { public: D(int b,int d) //A的构造函数不可访问,产生错误 :B(b) , _d(d) {} private: int _d; };
这样通过友元和虚继承的方法就能实现,定义出了一个不能被继承的类。
0 1
- 定义一个不能被继承的类
- C++中定义一个不能被继承的类
- 如何定义一个不能被继承的类
- 如何定义一个不能被继承的类
- C++定义不能被继承的类
- C++定义不能被继承的类
- 定义一个只能在堆上生成对象的类&&定义一个只能在栈上生成对象的类&&定义一个类不能被继承
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 写出一个不能被继承的类
- 设计一个不能被继承的类
- 设计一个不能被继承的类
- 写一个不能被继承的类
- C语言学习历程——编程练习2——02
- 精讲WEB前端之Flex弹性盒模型属性,对比每一属性值和效果
- jQuery动画
- 1、MAC常用工具汇总一
- js实现的下拉框二级联动效果
- 定义一个不能被继承的类
- poj1014(较复杂的背包问题)
- 抽象类 接口 的个人理解
- C语言学习历程——编程练习2——03
- Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败
- Ajax、JSON
- 2017.04.30 有关c语言的可变参数表的学习
- 如何用polyfill制作响应式图片轮播
- OKHttp原码分析(一)