C++多继承之菱形继承原理及解决方法

本文详细介绍了单继承和多继承的基本概念,以及菱形继承带来的问题。通过虚继承解决了数据冗余和二义性,同时区分了继承(is-a)和组合(has-a)的关系,讨论了它们在复用和封装上的优劣,强调了组合在可维护性方面的优势。
摘要由CSDN通过智能技术生成

目录

1.单继承和多继承

2.菱形继承

3.虚继承解决菱形继承

3.1使用方法

3.2虚继承原理

4.继承和组合


1.单继承和多继承

一个子类只有一个父类称为单继承

一个子类有多个父类称为多继承

2.菱形继承

菱形继承是多继承的一种复杂的情况

这里会出现一个问题,Assistant这个类中继承了两个Person类,造成了数据的冗余和二义性

例:

可以通过指定类域解决但是数据的冗余没有解决

3.虚继承解决菱形继承

3.1使用方法

虚继承可以在person被teacher和student继承时使用

在前面加个virtual

3.2虚继承原理

用一个简单的菱形继承模型,在借助内存窗口观察。

class A
{
public:
	int _a;
};
 class B : public A
//class B : virtual public A
{
public:
	int _b;
};
 class C : public A
//class C : virtual public A
{
public:
	int _c;
};
class D : public B, public C
{
public:
	int _d;
};
int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;
	return 0;
}

不加virtual时候看内存窗口很明显D对象中有两个a对象,有数据冗余。

加virtual之后对象A被放在了最底端,之前存放A的位置变成了一个地址。

这个地址指向基虚表,叫做基虚表指针,基虚表中存的时偏移量,通过偏移量可以找到A。

0x01 0F FD A4 + 0x00 00 00 14 = 0x 01 0F FD B8 正好是A的位置。

4.继承和组合

继承是is-a的关系,就是每一个派生类都是一个基类。

组合是has-a的关系,没事派生类都有一个基类

这就是组和

继承是白箱复用,对基类内部可见,一定程度破坏了封装,耦合度高。

组和是黑箱复用,对基类内部不可见,没有破坏封装,耦合度低。

组合比继承的可维护性更高,能用组合的地方就用组合。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值