首页 > 其他分享 >35多继承-菱形继承

35多继承-菱形继承

时间:2024-03-04 21:47:26浏览次数:20  
标签:ma cout 继承 35 int 菱形

多继承-菱形继承

菱形继承会导致相同的基类成员出现多份拷贝,解决方法是使用虚继承。
这样可以实现更多代码的的复用

虚继承
#include<iostream>
using namespace std;

class A
{
private:
	int ma;
public:
	A(int i) :ma(i)
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
};


class B: virtual public A
{
public:
	B(int i) : A(i), mb(i)
	{
		cout << "B()" << endl;
	}
	~B()
	{
		cout << "~B()" << endl;
	}
private:
	int mb;
};

class C : virtual public A
{
public:
	C(int i) : A(i), mc(i)
	{
		cout << "C()" << endl;
	}
	~C()
	{
		cout << "~C()" << endl;
	}
private:
	int mc;
};

class D : public B, public C
{
public:
	D(int i) : A(i), B(i), C(i), md(i)
	{
		cout << "D()" << endl;
	}
	~D()
	{
		cout << "~D()" << endl;
	}
private:
	int md;
};

//当B C虚继承A后,B C中所继承A的成员都会被一个vbptr指代,而A的成员全部放置B C内存的末尾
//同理D继承B C时,D的内存结构是B::vbptr,mb--C::vbptr,mc--md--A::ma
//这样就实现了A中数据的一份存储
int main()
{
	D d(10);
	cout << sizeof(d) << endl;
}

标签:ma,cout,继承,35,int,菱形
From: https://www.cnblogs.com/sio2zyh/p/18052772

相关文章

  • 代码随想录算法训练营第三十六天| ● 435. 无重叠区间 ● 763.划分字母区间 ● 56.
    无重叠区间 题目链接:435.无重叠区间-力扣(LeetCode)思路:我的思路是先将所有区间按左端点从小到大排序,左端点相同时右端点从小到大排序。接下来遍历数组,如果下一个区间与该区间有重叠部分,count加1,同时遍历下下一个区间(下一个区间被视为删除),同时如果下一个区间被包含在该区间中,......
  • 牛客周赛 Round 35
    牛客周赛Round35比赛链接小红的字符串切割思路一遍循环遍历就可以了,到中间位置时候输出一个换行符Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()#definect(x)cout<<x<<endlvoidsolve(){ strings;......
  • 牛客周赛 Round 35
    A.小红的字符串切割思路:拿到了一个长度为偶数的字符串,请你将其切割成长度相等的两部分并输出Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;for(inti=0;i<s.size()/2;i++){cout<<s[i];}c......
  • 牛客周赛 Round 35
    牛客周赛Round35小红的字符串切割代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;typedefdoubledb;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>......
  • C++ 继承
    1//基类2classAnimal{3  //eat()函数4  //sleep()函数5};678//派生类9classDog:publicAnimal{10  //bark()函数11};基类&派生类一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我......
  • C#的类和对象,继承
    ///类与对象///类和对象是面向编程的两个核心概念///类:类是对一群具有相同特征的或者行为事物的统称类是图纸///对象是由类创造出来的一个具体存在可以直接使用对象是图纸造出来的汽车///现有类再有对象类是抽象的对象是具体的//////类的设计数据建模//......
  • C++类开发的第六篇(虚拟继承实现原理和cl命令的使用的bug修复)
    Class_memory接上一篇末尾虚拟继承的简单介绍之后,这篇来详细讲一下这个内存大小是怎么分配的。使用clcl是MicrosoftVisualStudio中的C/C++编译器命令。通过在命令行中键入cl命令,可以调用VisualStudio的编译器进行编译操作。cl命令提供了各种选项和参数,用于指定源......
  • 代码随想录算法训练营第三十三天 | 135. 分发糖果, 134. 加油站, 1005.K次取反后最大化
      1005.K次取反后最大化的数组和 已解答简单 相关标签相关企业 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下......
  • 代码随想录算法训练营第三十三天| ● 1005.K次取反后最大化的数组和 ● 134. 加油站
    K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和-力扣(LeetCode)思路:首先增序排序,然后依次将负值取反,如果负数先用完,则再排序一次,将最小的正数取反之后求和;如果k先用完,直接求和。注意sort默认是增序排序,若想要要降序,则不能使用sort(nums.end(),nums.begin())......
  • C++类开发第五篇(继承和派生的初体验)
    inheritance在C++中,继承是一种面向对象编程的特性,允许一个类(称为子类或派生类)从另一个类(称为基类或父类)那里继承属性和行为。通过继承,子类可以获得父类的数据成员和成员函数,从而可以重用父类的代码并扩展其功能。这样可以提高代码的复用性和可维护性,同时也符合面向对象编程的封......