<十>关于菱形继承

代码1

#include <iostream>
using namespace std;
	
class A{

public:
	
 A(int _a):ma(_a){
   cout<<"A()"<<endl;
 }
	
 ~A(){
   cout<<"~A()"<<endl;
 }
	
protected:
	int ma;

};	

class B : public  A{

public:
	
 B(int _b):A(_b),mb(_b){
   cout<<"B()"<<endl;
 }
	
 ~B(){
   cout<<"~B()"<<endl;
 }
		
protected:
	int mb;

};	

class C : public  A{

public:
	
 C(int _c):A(_c),mc(_c){
   cout<<"C()"<<endl;
 }
	
 ~C(){
   cout<<"~C()"<<endl;
 }
		
protected:
	int mc;

};	

class D : public  B, C{

public:
	
 D(int _d):B(_d),C(_d),md(_d){
   cout<<"D()"<<endl;
 }
	
 ~D(){
   cout<<"~D()"<<endl;
 }
		
protected:
	int md;

};

	
int main(){
   D d(100);
 
  return 0;
}

//代码执行顺序
A()
B()
A()
C()
D()
~D()
~C()
~A()
~B()
~A()

D的内存结构

<十>关于菱形继承

发现有重复的 数据 ma

为了解决上面的问题,引入虚继承

代码2

#include <iostream>
using namespace std;
	
class A{

public:
	
 A(int _a):ma(_a){
   cout<<"A()"<<endl;
 }
	
 ~A(){
   cout<<"~A()"<<endl;
 }
	
protected:
	int ma;

};	

class B : virtual public  A{

public:
	
 B(int _b):A(_b),mb(_b){
   cout<<"B()"<<endl;
 }
	
 ~B(){
   cout<<"~B()"<<endl;
 }
		
protected:
	int mb;

};	

class C : virtual public  A{

public:
	
 C(int _c):A(_c),mc(_c){
   cout<<"C()"<<endl;
 }
	
 ~C(){
   cout<<"~C()"<<endl;
 }
		
protected:
	int mc;

};	

class D : public  B, C{

public:
	
 D(int _d):A(_d),B(_d),C(_d),md(_d){
   cout<<"D()"<<endl;
 }
	
 ~D(){
   cout<<"~D()"<<endl;
 }
		
protected:
   int md;

};
	
int main(){
   D d(100);
 
  return 0;
}
//执行结果
A()
B()
C()
D()
~D()
~C()
~B()
~A()

//A的构造有D 来完成 B和C下面有各自的vbptr 定位得基类数据

<十>关于菱形继承

虚继承用来解决多重继承中遇到的多份数据的问题

虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要(因为这样只会降低效率和占用更多的空间,关于这一点,我自己还没有太多深刻的理解,有兴趣的可以看网络上白杨的作品《RTTI、虚函数和虚基类的开销分析及使用指导》)。

原文链接: https://www.cnblogs.com/erichome/p/16936667.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    <十>关于菱形继承

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/5045

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月4日 下午7:15
下一篇 2023年2月4日 下午7:16

相关推荐