C++ | 菱形继承与虚继承


前言

简单介绍一下C++中的菱形继承

提示:以下是本篇文章正文内容,下面案例可供参考

一、菱形继承是什么?

菱形继承:指有一个基类被两个不同的类所继承,且存在一个类继承于这两个类而形成的一种菱形关系,故称菱形继承。如下图所示:
在这里插入图片描述
如果Person中含有一个性别属性,在Base中是女,在Test中是男,那么在Stud_Elem中性别这个属性就会产生异议。

二、没有虚继承的情况

1.具体代码

代码如下(示例):

class Object
{
public:
	Object(int x = 0) :value(x) {}
private:
	int value;
};
class Base:public Object
{
public:
	Base(int x = 0) :Object(x + 10), num(x) {}
private:
	int num;
};
class Test:public Object
{
public:
	Test(int x = 0) :Object(x + 10), sum(x) {}
private:
	int sum;
};
class Det:public Base,public Test
{
public:
	Det(int x = 0) :total(x),Base(x + 10), Test(x + 20) {}
private:
	int total;
};
int main()
{
	Det d;
	return 0;
}

2.结构图

在这里插入图片描述
在Det的内存中存在着两个Object对象,一个是来自base的,一个是来自test的。

二、有虚继承的情况

1.具体代码

代码如下(示例):

class Object
{
public:
	Object(int x = 0) :value(x) {}
private:
	int value;
};
class Base:virtual public Object
{
public:
	Base(int x = 0) :Object(x + 10), num(x) {}
private:
	int num;
};
class Test:virtual public Object
{
public:
	Test(int x = 0) :Object(x + 10), sum(x) {}
private:
	int sum;
};
class Det:public Base,public Test
{
public:
	Det(int x = 0) :total(x),Base(x + 10), Test(x + 20),Object(x+100) {}
	//Object的对象构造只会执行一次,在Base和Test中不再进行构造
private:
	int total;
};
int main()
{
	Det d;
	return 0;
}

2.结构图

在这里插入图片描述

总结

提示:这里对文章进行总结:
虚继承主要解决菱形继承中属性存在二义性的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值