C++菱形继承+虚继承
来源:互联网 发布:centos软件包管理器 编辑:程序博客网 时间:2024/05/28 01:35
单继承和多继承
单继承:一个派生类只有一个直接基类。
(B的直接父类只有A,是单继承)
class AA{public: AA(int a=1) :_a(a) { cout << "AA()" << endl; } int _a;};class BB : public AA{public: BB(int b=2) :_b(b) { cout << "BB()" << endl; } int _b;};
多继承:一个派生类的直接基类至少有两个。
(C类不仅继承了A类,还继承了B类,是多继承)
class CC : public AA ,public BB{public: CC(int c=3) :_c(c) { cout << "CC()" << endl; } int _c;};
菱形继承属于多继承。
#include<iostream>#include<stdlib.h>using namespace std;class A{public: A(int a=1) :_a(a) { cout << "A()" << endl; } int _a;};class B : public A{public: B(int b=2) :_b(b) { cout << "B()" << endl; } int _b;};class C : public A {public: C(int c=3) :_c(c) { cout << "C()" << endl; } int _c;};class D : public B, public C{public: D(int d=4) :_d(d) { cout << "D()" << endl; } int _d;};int main(){ D d; d._a;}
对上面代码进行编译,发现不通过,错误如下:
这个是菱形继承存在的二义性的问题。
从图中可以看出来,在D类中B类和C类分别存了一份A类的成员变量,造成了数据冗余的问题。
二义性问题可以通过指定类域进行访问,但是这样太麻烦,而且数据冗余的问题并没有得到解决。针对这个问题C++引入了虚继承。
虚继承:继承的前面加上virtual.
形如:class 派生类名:virtual 继承方式 基类名
(virtual为关键字,声明该基类为派生类的虚基类)
#include<iostream>#include<stdlib.h>using namespace std;class A{public: A(int a=1) :_a(a) { cout << "A()" << endl; } int _a;};class B : virtual public A{public: B(int b=2) :_b(b) { cout << "B()" << endl; } int _b;};class C : virtual public A {public: C(int c=3) :_c(c) { cout << "C()" << endl; } int _c;};class D : public B, public C{public: D(int d=4) :_d(d) { cout << "D()" << endl; } int _d;};int main(){ D d;}
虚继承的内存分布有所变化,这里将公共的A类成员变量单独存起来,以前存A类成员变量的地方存了虚基类的地址,这个地址存的是A类成员变量距派生类地址的偏移量。
虽然虚继承解决了菱形继承二义性和数据冗余的问题,但是性能上会有所影响。
没有使用虚继承时,sizeof(d)=20;
使用虚继承后,sizeof(d)=24.
阅读全文
0 0
- 菱形继承 虚继承
- (C++)继承、菱形继承和虚继承的那些事儿
- 【C++】继承(菱形继承)
- <c++>继承及菱形继承
- 【C++】菱形继承
- 【c++】菱形继承
- 【c++】菱形继承
- 继承,菱形继承,多态,虚继承、菱形虚拟继承
- 菱形继承与菱形虚继承剖析
- 菱形继承和菱形虚继承
- 菱形继承和虚继承
- 菱形继承和虚继承
- 菱形继承—虚继承
- 菱形继承与虚继承
- C++ 菱形继承&虚继承
- C++菱形继承+虚继承
- 菱形继承中的虚继承
- 菱形继承与虚继承
- hdu6222(递推规律+java大数)
- hough forest----Class-Specific Hough Forests for Object Detection
- 日记本首页(index.php)
- day6下
- php上传公众号临时素材-微信开发素材管理6
- C++菱形继承+虚继承
- 一张图解mysql的join关系
- HTML5-网页排版划分
- 【HDU 6228、2017ACM/ICPC亚洲区沈阳站】Tree
- 输入n输出1/3+3/5+5/7+······+n/(n+2)的分数形式(n<40)
- 操作系统的工作流程(流程图表示)
- DHCP(一)
- 如何在三年内快速成长为一名技术专家
- Matlab中numel的用法