首页 > 其他分享 ><十>关于菱形继承

<十>关于菱形继承

时间:2022-11-29 21:55:06浏览次数:31  
标签:多重 ma cout 继承 namespace int 菱形 关于

代码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、虚函数和虚基类的开销分析及使用指导》)。

标签:多重,ma,cout,继承,namespace,int,菱形,关于
From: https://www.cnblogs.com/erichome/p/16936667.html

相关文章

  • 实验5 继承与多态
    task4hpp#pragmaonce#include<iostream>usingnamespacestd;classMachinePets{private:stringnickname;public:conststringget_nickname(){ret......
  • 实验5 继承和多态
    task4pets.h#pragmaonce#include<iostream>#include<string>usingnamespacestd;classMachinePets{public: stringnickname; MachinePets(){} MachineP......
  • 实验5 继承和多态
    实验任务41#pragmaonce2#include<iostream>3#include<string>4usingnamespacestd;56classMachinePets{7private:8stringnickname;9......
  • 实验5 继承与多态
    task4#pragmaonce#include<iostream>usingnamespacestd;classMachinePets{public:MachinePets(conststrings):nickname(s){}stringget_nickname(......
  • 对象原型 原型链 原型继承 constructor属性
    原型:   每个构造函数身上都有一个prototype原型  原型身上有一个对象   被称为原型对象(构造函数的this和原型上的this都指向实例化对象)<body>......
  • 关于Cookie
     1.测试:Cookie和端口无关,和ip或域名有关localhost:81设置cookie           :   请求发现请求头有cookielocalhost:82不设置cookie  ......
  • 实验5 继承和多态
    实验任务4:pets.hpp:#include<iostream>usingnamespacestd;classMachinePets{public:MachinePets(conststrings):nickname{s}{}virtual......
  • 实验五 多态和继承
    1#pragmaocne2#include<iostream>3#include<string>4usingnamespacestd;5classMachinePets6{7stringnickname;8public:9......
  • 使用 SAP WebIDE 将 SAP UI5 应用部署到 ABAP 系统时遇到的关于传输请求的错误
    有朋友遇到一个在webide里部署SAPUI5应用到ABAPRepository里时出错的问题:错误消息:Failedtogettransportsfortheselectedpackage.RequestPOST/webided......
  • Swift的基础之关于“!”和“?”的使用介绍
    swift编程,不外乎是定义属性或者函数(方法),访问属性或者调用函数,类型转换,?和!在这几个过程中,都有一展身手的时候,而且,每次要考虑使用的时候,它们俩都会一起出现在我们的大脑中,用还......