菱形虚拟继承和菱形继承的对比

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

     懒博主终于上线啦!今天要和大家分享的是关于菱形虚拟继承和菱形继承的一些看法。

关于菱形虚拟继承,大家都知道,通常情况下由于c++允许多继承而形成的菱形继承会导致二义性和数据冗余,举个栗子吧!


菱形继承


一个菱形继承模型

如上图所示的一般菱形继承中,二义性出现在manage类中_name上,无法确定_name成员到底是属于work类还是message类;而在manage类中可能存在work类和message类的_name成员的值相等的情况,即manage类中有两个含义相同的量,这就导致了数据冗余。

为了解决菱形继承的二义性和数据冗余,我们使用虚继承。利用上面的栗子我们可以简略的从代码上区别菱形继承和菱形虚拟继承:


为了探索虚拟继承为啥可以解决二义性和数据冗余,我们从主观的监视窗口和内存管理分别区分如下:


监视窗口对比图


内存管理对比图

由上图可知,虚拟继承把具有二义性的成员用指向存放该位置到存储成员数据位置的偏移量的指针来代替原成员数据,并把具有二义性的成员数据放在类中其他成员数据之后。此时成员就不再具有二义性,类中只有一份成员数据,不存在相同成员含义的两分数据,因此也就不会存在二义性和数据冗余问题了。

今天的分享就到这里了!再会!

Python多重继承菱形继承的实例详解 继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。 语法 class SubclassName(BaseClass1, BaseClass2, BaseClass3, …): pass 菱形继承 在多层继承继承同时使用的情况下,就会出现复杂的继承关系,多重多继承。 其中,就会出现菱形继承。如下图所示。mark 在这种结构中,在调用顺序上就出现了疑惑,调用顺序究竟是以下哪一种顺序呢 D->B->A->C(深度优先) D->B->C->A(广 立即下载

相关推荐

Python---菱形继承

这个代码中,在调用son的feel方法之后,先打印7然后进入父类的feel中,因为继承的第一个父类是Man,所以会打印3,然后在进入Woman中的feel,打印5,在进入Human中的feel。打印1,直到执行完Human中的feel,回到Woman,继续执行,在回到Man,最后是Children。菱形继承是指在一个类继承体系中存在一条继承链上的两个不同类,它们最终都直接或间接地继承自同一个父类。

weixin_73888239的博客 565

python 常用语法及命令(六) 类 对象 继承(菱形继承问题) 组合 BIF(内置函数issubclass,isinstance)

封装 继承 多态 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。 1、self 就是 c++中的this指针 >>> class Person: def setName(self, name): self.name = name def getName(self)...

damonlearning的博客 822

Python 类的多继承下的菱形问题的基本使用及原理(60)

继承指的是一个子类可以同时继承多个父类的属性方法。在 Python 中,通过在定义子类时,在类名后的括号内列出多个父类名,就可以实现多继承。# 定义父类 Aclass A:# 定义父类 Bclass B:# 定义子类 C,继承自 A Bpass# 创建子类 C 的对象c = C()# 调用从父类继承的方法c.method()在上述代码中,C类继承了A类B类,这就是多继承的基本实现方式。Python 的多继承特性为代码复用提供了强大的支持,但也带来了菱形问题。

Android开发领域创作者 790

python菱形问题

Python类分为两种,一种叫经典类,一种叫新式类。都支持多继承,但继承顺序不同。

511

【C++】菱形继承虚拟菱形继承对比分析

继承中经常会遇到这种情况:有一个超类A,子类B1,B2继承了A,而类D又继承了父类B1,B2。在这种情况下如果按照我们以前的正常的菱形继承的话会有一个问题是子类C会继承两次超类A中的成员,当在C中想访问继承来自B1,B2中A的元素会出现两个问题:    问题一、数据的冗余    问题二、访问的二意性出现了这种问题那么我们该如何解决呢?    C++中为了解决这个问题引入了虚拟菱形继承,那么虚拟

zangyuanan320的博客 407

C++:面向对象大坑:菱形继承

C++:面向对象菱形继承分析及解决

林的最终章的博客 2746

菱形虚拟继承对象内存模型详解

C++语言作为编程语言老大哥(也是第一个吃螃蟹的)无法避免的的踩中了这个大坑。后来的一些面向对象编程语言也是吸取C++的经验,取消了多继承的语法,如Java等。

GG_Bruse的博客 1159

继承菱形继承以及虚拟菱形继承

虚拟继承中的虚拟基类成员只会实例化一份,在菱形继承中解决了数据冗余的问题,同时也解决了二义性。虚拟继承虽然解决了菱形继承问题,但它也引入了额外的复杂性性能开销。每次通过派生类访问虚拟基类的成员时,都需要进行额外的间接寻址。这可能会影响性能,尤其是在性能敏感的应用中。因此,在设计类的继承结构时,应仔细考虑是否真的需要虚拟继承。在选择是使用继承还是组合时,我们应该根据实际需求的上下文来决定。如果类之间的关系是很明显的is a且又要实现多态的时候,用继承比较合适。

稻草人敲代码的博客 1187

【C++】继承菱形继承虚拟继承,组合详解

继承虚拟继承,组合

林宇恒的博客 1245

【C++】继承(三):破解C++菱形继承之谜:为什么我们需要虚拟继承

很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java继承组合先来讲一下什么是组合?举个例子:public:private:Person _p;int _age;这就是组合,他继承很像,都可以使用到Person里面的成员,但是。

2201_76005883的博客 1075

菱形继承组合与继承的选择。

继承:一个子类只有一个直接父类的继承关系。 多继承:一个子类有两个或两个以上的直接父类的继承关系。 菱形继承:是多继承的一种特殊情况。 菱形继承问题的具体分析: class Person{ public: string _name; } class Student : public Person{ protected: int _num; } class Tea...

Darling_sheeps的博客 187

菱形继承菱形虚拟继承(原理:虚基表)

继承体系中有单继承、多继承菱形继承,(菱形继承其实是多继承的一种特殊情况)。 单继承:一个子类只有一个直接父类时称这个继承关系为单继承继承:一个子类有两个及以上个直接父类称这个继承关系为多继承 菱形继承:多继承的一种特殊情况。一个子类有多个直接父类并且这些直接父类的父类是同一个父类 菱形继承带来的问题: 拿上面菱形继承的图中的例子来看:因为有子类 Assistant 是继承自多个父...

Code_beeps的博客 934

解锁C++继承的奥秘:从基础到精妙实践(下)

我们接上集解锁C++继承的奥秘:从基础到精妙实践(上),继续深入探讨C++继承的多重继承的处理、虚函数与多态的应用,以及如何在复杂系统中有效利用继承来构建可维护且扩展性强的代码架构。通过系统的学习,你将对C++继承有更深入的理解,并能够在实际开发中灵活应用这些知识。今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!

17的博客 4514

复杂的菱形继承菱形虚拟继承

一个子类只有一个直接父类时称这个继承关系为单继承

didi1663478999的博客 294

[C++系列 70. 菱形继承菱形虚拟继承

文章目录0. 前述1. 单继承与多继承2. 菱形继承3. 继承的总结反思4. 常见笔试面试题5. 继承总结 0. 前述 本篇博文承接[C++系列] 67. 继承基础讲解部分,进一步深入讨论更为复杂的菱形继承。 为更进一步加深理解,可参考[C++系列] 68.多态基础及虚函数、抽象类详解、[C++系列] 69. 多态的原理这两篇博文。 1. 单继承与多继承继承:一个子类只有一个直接父类时称这个...

Y-puyu 的博客 544

C++中的继承【父类子类的赋值转化】【子类的默认成员函数】【菱形继承菱形虚拟继承(重要)】

有关cpp中继承的详细学习。【继承的概念定义】【成员权限与继承权限的关系】【继承的作用域】【父类子类的赋值转换】【子类的默认成员函数】【菱形继承的弊端以及为什么要用菱形虚拟继承解决】【菱形虚拟继承的原理】

aaa114514aaaa的博客 1914

菱形虚拟继承

菱形继承在C++继承中是一种复杂的继承关系,存在着二义性数据冗余的问题,而菱形虚拟继承则是为了解决菱形继承所存在的问题。为了探讨菱形虚拟继承如何解决该问题,我先建立个一个较为简单的菱形继承模型。下面分别是菱形继承菱形虚拟继承的代码实现: //菱形继承 #include #include using namespace std; class AA { public: int _aa; };

he_shuai20的博客 628
上一篇: c语言宏相关知识分享
下一篇: 二分法查找易错点解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值