C++--菱形继承

这篇具有很好参考价值的文章主要介绍了C++--菱形继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.什么是菱形继承

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

                                C++--菱形继承,c++

 文章来源地址https://www.toymoban.com/news/detail-616255.html

        多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承

C++--菱形继承,c++

菱形继承的问题:菱形继承有数据冗余和二义性的问题,数据冗余是由于创建多个相同类型的数据,浪费空间,二义性是由于两个不同的类同时继承了一个相同的类

C++--菱形继承,c++

 

虚拟继承可以解决菱形继承的二义性和数据冗余的问题.需要注意的是,虚拟继承不要在其他地
方去使用,且在B,C处使用virtual关键字即可。

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._a = 1;
	B b;
	b._a = 0;

	B* ptr = &b;
	ptr->_a++;
	
	 ptr = &d;
	 ptr->_a++;*/
	 //cout << b._a << endl;
	/*d.B::_a = 10;
	d.C::_a = 11;

	 cout << d.B::_a << endl;
	 cout << d.C::_a << endl;*/

	B b;
	b._a = 10;
	C c;
	c._a = 11;
	cout << b._a << endl;
	cout << c._a << endl;

	return 0;
}

在菱形继承情况下:有菱形继承的二义性和数据冗余的问题。

C++--菱形继承,c++

 从上图中可以看出B中有一个·a,C中也有一个a,造成数据的二义性。

使用菱形继承:

C++--菱形继承,c++

这个数据为16进制的数据,为20和12,而20和12正好是B里面的指针减去A的指针和C里面的指针减去A的指针的大小,所以这两个数就是偏移量,这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。所以使用虚拟继承可以解决数据冗余和二义性问题。

3.总结

C++--菱形继承,c++

 

到了这里,关于C++--菱形继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】从0到1讲继承|复杂的菱形继承

        个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 本文主要讲述的是继承的概念,以及基类和派生类和衍生出的各种东西,还有多继承,菱形继承等,从0到1讲解继承。 与日常生活中的人的继承相关,你可

    2024年02月16日
    浏览(29)
  • C++:面向对象大坑:菱形继承

    单继承:一个子类只有 一个直接父类 时称这个继承关系为单继承。 图示: 多继承:一个子类有 两个或以上直接父类 时称这个继承关系为多继承。 图示: 1.概念 菱形继承:菱形继承是多继承的一种特殊情况。即:一个类是另外几个类的子类,而这几个子类又是另外一个类

    2024年04月27日
    浏览(28)
  • 【C++练级之路】【Lv.12】继承(你真的了解菱形虚拟继承吗?)

    快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C++》 远方有一堆篝火,在为久候之人燃烧! 继承(inheritance),是面向对象的三大特性之一。 它是面向对象编程中, 使代码可以复用 的最重要的手段,它允许程序员在 保持原有类特性的基础上进行扩展

    2024年03月14日
    浏览(37)
  • C++中菱形继承中的多态在底层是如何实现的。

    如果还不了解菱形继承和多态的底层可以看这两篇文章: C++中多态的底层实现_Qianxueban的博客-CSDN博客 C++的继承以及virtual的底层实现_Qianxueban的博客-CSDN博客

    2024年02月09日
    浏览(27)
  • 想要入坑C++?当我拿出菱形虚拟继承,阁下又该如何应对

    🌸作者简介: 花想云 ,目前大二在读 ,C/C++领域新星创作者、运维领域新星创作者、CSDN2023新星计划导师、CSDN内容合伙人、阿里云专家博主、华为云云享专家致力于 C/C++、Linux 学习 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造

    2024年02月07日
    浏览(29)
  • 【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解

    🏠专栏介绍:浅尝C++专栏是用于记录C++语法基础、STL及内存剖析等。 🎯每日格言:每日努力一点点,技术变化看得见。 我们生活中也有继承的例子,例如:小明继承了孙老师傅做拉面的手艺。继承就是一种延续、复用的方式。C++为了提高代码的可复用性,引入了继承机制,

    2024年04月10日
    浏览(38)
  • C语言打印各种三角形和菱形(包括星形菱形与空白格菱形)

    多重循环,也称嵌套循环,由一个外层循环和一个或多个内层循环组成。 for循环在C语言基础中占有重要地位,其中最能体现for的多重循环的就是打印各种形状的三角形,进而根据打印各种三角形的规律合并打印出菱形。 首先,我们来打印最简单的几个不同的三角形: 靠右直

    2024年02月04日
    浏览(32)
  • python打印菱形

    打印菱形 方法一: 效果:   方法二: 打印 空心菱形 需要加上if else 语句 其他代码和打印菱形相同 效果:  打印此图形重点在于打印对角线 需要在if条件原有的基础上加上相应条件 (i == layer//2+1 or j == i )   效果:  

    2024年02月08日
    浏览(25)
  • 菱形图案(java)

    第一种方法 1.使用for循环进行输出菱形 输出菱形的空格需要把握好(阔以用for循环) 下部分林型7直接把上部分的代码复制粘贴一份,修改一下参数,+=变成-= 代码如下: public class for4 { public static void main(String[] args) {  int sp = 20;  for (int i = 1; i = 20; i += 2) {  sp--;  //空格  for (int n =

    2024年02月07日
    浏览(23)
  • 打印菱形(C语言)

    首先,可以将菱形分成上下两部分 代码如下 代码如下 完整代码

    2024年02月06日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包