抽象类和虚基类的定义及用途
来源:互联网 发布:php登录页面完整代码 编辑:程序博客网 时间:2024/06/06 23:52
抽象类不能实例化对象!
为了让一个类成为抽象类,至少必须有一个纯虚函数。包含至少一个纯虚函数的类视为抽象类!
classA{public:virtual void lock(void)=0;virtual void unlock(void)=0;virtual ~A(void);}//将函数lock()和unlock()初始化为0使它们成为纯虚函数,没有0这个初使化器,它们仅仅是虚函数。
如果子类是一个非抽象类的的话,必须重写父抽象类的所有抽象方法,如果子类是一个抽象类的话,可以重写父抽象类的抽象方法,也可以继承父抽象类的抽象方法~
虚基类
class x1:virtual public x //virtual也可以写在public后面{//……};虚基类可以解决二义性的问题
其实说白了就是解决多重多级继承造成的二义性问题。例如有基类B,从B派生出C和D,然后类F又同时继承了C和D,现在类F的一个对象里面包含了两个基类B的对象,如果F访问自己的从基类B那里继承过来的的数据成员或者函数成员那么编译器就不知道你指的到底是从C那里继承过来的B对象呢还是从D那里继承过来的B对象。
于是虚基类诞生了,将C和D的继承方式改为虚继承,那么F访问自己从B那里继承过来的成员就不会有二义性问题了,也就是将F对象里的B对象统一为一个,只有一个基类B对象,下面是一段代码说明了对虚基类的使用。
#include <iostream>using namespace std;class A{ public: int i; void showa(){cout<<"i="<<i<<endl;}};class B:virtual public A //此处采用虚继承{ public: int j;};class C:virtual public A //此处采用虚继承{ public: int k;};class D:public B,public C//调用析构函数时先调用虚基类的构造函数,然后挨个最后调用基类的析构函数,构造函数反过来{ public: int m;};int main(){ A a; B b; C c; a.i=1; a.showa(); b.i=2; b.showa(); c.i=3; c.showa(); D d; d.i=4; d.showa(); //cout << "Hello world!" << endl; return 0;}
从这个代码我们可以看出B,C,D从A那里继承过来了i这个变量并且它们之间不会有任何影响,如果B和C不是虚继承方式的,那么d.i=4;就不能编译通过了。
创建派生类的对象时:先调用基类构造函数,对象成员构造函数(单选上的,并不太懂),派生类本身构造函数.
1 0
- 抽象类和虚基类的定义及用途
- 抽象类的用途
- 抽象类的定义及运用
- JMeter的组成元件 定义及用途
- 抽象类和抽象方法的定义和使用
- java接口和抽象类的定义
- 类的callback抽象定义和调用
- 在Python中定义和使用 抽象类及抽象方法 抽象属性
- 数据库索引的定义,用途和使用方法
- 定义表空间和数据文件的用途
- webservice的定义、描述和用途详解
- java 接口的定义,使用及和抽象类的区别
- 抽象类专题二:抽象类的用途
- java中的final关键字、抽象类及接口的定义
- java接口和抽象类的区别和作用(功能、用途、好处)
- 定义接口和抽象类
- 【48】java抽象类和接口的定义和区别
- Interface的定义及其和抽象类的不同
- 手动将jar文件加到Maven的local repository中
- GIT 第一问 怎么删除github上的仓库
- php伪静态重写规则
- Swit轉場動畫的簡單分析
- clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别
- 抽象类和虚基类的定义及用途
- limits 错误:宏“min”需要 2 个参数,但只给出了 1 个
- OAOR中模板无法包到请求号中导致无法传输
- xcode快捷键丨工具
- viewPager的无限轮播加底部小圆点
- Ubuntu使用疑难杂症
- 使用RxJava从多个数据源获取数据
- 编译警告:warning C4996 与 Security Enhancements in the CRT
- TCPdump抓包命令 详解