C++虚拟继承问题

从DIY桌面CNC到工业机器人:手把手教你用LinuxCNC搭建自己的第一台数控系统(基于Xenomai实时补丁) 本文详细介绍了如何使用LinuxCNC和Xenomai实时补丁搭建高性价比的数控系统,从硬件选型到实时系统构建,再到HAL硬件抽象层实战和G代码加工,手把手教你打造从DIY桌面CNC到工业机器人的完整解决方案。 阅读详情

1.引入虚继承和直接继承会有什么区别呢

由于有了间接性和共享性两个特征,所以决定了虚继承体系下的对象在访问时必然会在时间和空间上与一般情况有较大不同。

1)时间:在通过继承类对象访问虚基类对象中的成员(包括数据成员和函数成员)时,都必须通过某种间接引用来完成,这样会增加引用寻址时间(就和虚函数一样),其实就是调整this指针以指向虚基类对象,只不过这个调整是运行时间接完成的。

2)空间:由于共享所以不必要在对象内存中保存多份虚基类子对象的拷贝,这样较之多继承节省空间。虚拟继承与普通继承不同的是,虚拟继承可以防止出现diamond继承时,一个派生类中同时出现了两个基类的子对象。也就是说,为了保证这一点,在虚拟继承情况下,基类子对象的布局是不同于普通继承的。因此,它需要多出一个指向基类子对象的指针。


2.笔试,面试中常考的C++虚拟继承的知识点

第一种情况:         第二种情况:          第三种情况            第四种情况:
class a           class a              class a              class a
{              {                {                 {
    virtual void func();      virtual void func();       virtual void func();        virtual void func();
};              };                  char x;              char x;
class b:public virtual a   class b :public a           };                };
{              {                class b:public virtual a      class b:public a
    virtual void foo();        virtual void foo();     {                 {
};              };                  virtual void foo();        virtual void foo();
                               };                };

如果对这四种情况分别求sizeof(a),  sizeof(b)。结果是什么样的呢?下面是输出结果:(在vc6.0中运行)
第一种:4,12 
第二种:4,4
第三种:8,16
第四种:8,8


因为每个存在虚函数的类都要有一个4字节的指针指向自己的虚函数表,所以每种情况的类a所占的字节数应该是没有什么问题的,那么类b的字节数怎么算呢?看“第一种”和“第三种”情况采用的是虚继承,那么这时候就要有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节;还要包括类a的字节数,所以类b的字节数就求出来了。而“第二种”和“第四种”情况则不包括vptr_b_a这个指针,这回应该木有问题了吧。

基于Simulink的柔性关节人形机器人振动抑制控制仿真 本文完成了基于Simulink的柔性关节人形机器人振动抑制控制仿真,实现了:✅ 建立二质量柔性关节动力学模型✅ 设计加速度反馈主动阻尼控制器✅ 对比陷波滤波与状态反馈效果✅ 验证大幅运动下的快速振动衰减能力✅ 为高动态人形机器人操作(如击掌、搬运)提供平滑执行基础。 阅读详情

相关推荐

从零开始搭建企业级安全扫描平台:基于Docker的Greenbone和ClamAV部署指南

本文提供了一份基于Docker容器技术,从零开始搭建企业级安全扫描平台的实战指南。详细介绍了如何部署和集成漏洞扫描工具Greenbone与病毒扫描工具ClamAV,涵盖架构设计、Docker环境优化、容器化部署步骤以及平台集成与监控方案,帮助企业构建自动化、可扩展的安全防御核心组件。

delta的博客 756

C++ 虚拟继承问题

文章目录前言为什么要有虚拟继承虚拟继承和普通继承的区别虚拟继承 sizeof() 问题 前言 本篇文章主要描述虚拟继承中内存分布情况,当然,可能会不太完全正确,希望大家多多指正 为什么要有虚拟继承 我们看下面一种情景: class A { public: int a; }; class B : public A { public: int b; }; class C : public A ...

The Laughing Uncle的博客 9963

告别功能限制:Win11家庭版无损升级专业版全攻略

本文详细介绍了如何将Win11家庭版无损升级到专业版的全过程,包括升级前的准备、两种官方升级方案(Microsoft Store购买和使用产品密钥)以及命令行升级方法。升级后可解锁远程桌面、组策略编辑器和BitLocker加密等高级功能,适合需要更多商业功能的用户。

weixin_32822843的博客 702

C++菱形继承的二义性问题(虚拟继承)

C++菱形继承如下: #include<iostream> using namespace std; class A { public: int a; }; class B1 : public A { public: int _B1; }; class B2 :public A { public: int _B2; }; class C :public B1, public B2 { public: int c; }; int main() { C c1; c1.a=5; re

ambiguous__的博客 4635

别再死磕文档了!用国产MBSES软件5分钟上手MBSE建模(保姆级图文教程)

本文通过国产MBSES软件,详细演示了如何在5分钟内完成智能家居系统的MBSE建模。从模块图定义到状态机图构建,再到参数约束验证,全程图文指导,帮助工程师快速掌握基于模型的系统工程方法,显著提升复杂系统设计效率。

weixin_26833503的博客 237

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题

C++菱形继承及虚拟继承的相关知识点,继承路上的重难点,不懂的可以仔细看一下!!!

2301_80220607的博客 2754

大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows

大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑

xbsigeibwkouvfcj的博客 3430

【C++】菱形继承与虚拟继承深度解析:从问题到解决方案

本文深入探讨C++中复杂的继承关系——菱形继承及其引发的数据冗余、二义性问题。通过详细分析虚拟继承机制,揭示虚基表、虚基表指针的工作原理,结合内存模型分析,系统性地解析虚拟继承如何解决菱形继承问题。文章从单继承到多继承,逐步构建完整的虚拟继承知识体系。

2403_88316985的博客 1246

百度新闻评论内容抓取

通过抓包分析发现,百家号手机app端文章评论内容接口为:https://ext.baidu.com/api/comment/v1/comment/getlist?appid=101&sid=1008524_2-1010050_1-1007549_23033-1007550_23035&cuid=01B5EAF73E8A83BB842BE04E4FB6C656|23200201047...

codingforhaifeng的博客 2422

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

C++ 继承、菱形继承问题、虚拟继承、虚基表

1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。3. 继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。优先使用对象组合,而不是类继承。

Asuiiiyi的博客 253

20、认知负荷理论在教育技术中的应用

本文深入探讨了认知负荷理论(Cognitive Load Theory, CLT)在教育技术中的应用,重点分析了如何通过优化教学设计减少学习者的认知负荷,提高学习效率。文章介绍了认知负荷的三种类型:内在认知负荷、外在认知负荷和germane认知负荷,并结合多媒体学习原则(如模态效应、空间连续性原则、时间连续性原则等)提出了减少外在认知负荷的具体策略。此外,文章通过实证研究和教学案例,展示了认知负荷理论在不同学科和个性化教学中的广泛应用和有效性。最终,文章总结了应用认知负荷理论进行教学设计的具体流程,强调其在

solidity8miner的博客 923

C++ 菱形虚拟继承 与 指针偏移问题

首先在谈到菱形虚拟继承之前先说明一下菱形继承: 菱形继承是多继承的一种特殊情况(如下,画渣勿喷): 图中 B C 两个类都继承了A类,而 B C 又都被 D类继承按照继承的定义,派生类当中都包含了基类,而这时虚拟继承这种情况就会产生问题 <a>数据冗余首先是按照虚拟继承的这种方法,D类当中就包含了两份A类数据(分别来自B类和C类)<b>二义性其次是,当我们通过D类去访问A类...

qq_41574298的博客 470

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++继承的问题 : 菱形继承 (虚拟继承)

上一次我们学习了继承相关的知识, 这次我们来看看继承的问题 — 菱形继承. 文章目录一. 什么是菱形继承二. 菱形继承的问题三. 虚拟继承 一. 什么是菱形继承 一图流解释 二. 菱形继承的问题 就拿上面的经典菱形继承来说, 从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在D类的对象中A类成员会有两份。 . 下面给出菱形继承的代码 : //菱形继承 class AA { public: int _aa; }; class BB : public AA { //AA::_.

Monster的博客 1002

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++虚拟继承多出来的空间问题

虚拟继承在继承权限前加上virtual关键字即可构成虚拟继承,如: 我们可以深入了解一下虚拟继承的对象模型;如现有一个基类B,含有一个公有类型的整形成员_b,派生类D公有继承基类B,且派生类D含有自己的一个整形数据成员_d,我们写一个测试函数来研究一下派生类D的对象模型: 通过编译器单步调试,可以先看一下基类B和派生类D的空间大小,在查看结果之前,我们可以先用自己目前所了解的知识分析一下他们的空间大小是多少,派生类D单继承基类B,基类B只有一个int类型的成员_b,所以基类B的空间大小应该是4字节,根据

yayaCINDY的博客 334

C++菱形继承问题与虚拟继承原理

B和C同时继承了A中的a,然后又派生出了D,因而D中存在两份a:一份是B::a,一份是C::a。因此,在D中直接访问a会导致错误,此时的a就具有二义性,需要指定类作用域才能访问。多个类继承了同一个公共基类,而这些派生类又同时被一个类继承,这种称为菱形继承或钻石继承。多个类继承了同一个公共基类,而这些派生类又同时被一个类继承,这种称为菱形继承或钻石继承。B和C同时继承了A的成员,此时D继承B和C,相当于获得了两份A的成员,造成数据冗余。注:公共数据的位置可能是D的开头,也可能是结尾,依编译器而定。

geek! 689

C++中虚拟继承问题

#include using namespace std; class A{ public: A(char *s) { cout<<s<<endl; } ~A(){} }; class B: virtual public A { public: B(char *s1,char *s2):A(s1){ cout<<s2<<endl; } }; class C:virtual p

王小东大将军的博客 396

c++ 非虚拟继承可以正常使用,虚拟继承后执行的问题

本文源于C++对话系列类层次结构相当简单: class parent{public: virtual void f(); // etc...};class child : public virtual parent{public: void f();};我所做的修改之一就是把child虚拟地继承于parent,使它在这个

蒋黎科的专栏 1025

【C++】菱形继承带来的问题以及菱形虚拟(virtual)继承解决问题的原理

C++菱形继承带来危害和解决菱形继承的方法及其原理

fufufu_的博客 631

【C++】什么是菱形继承?菱形继承存在的问题?什么是虚拟继承?

目录

量变产生质变 355

什么是虚拟继承

虚拟继承(Virtual Inheritance) 是 C++ 中的一种继承方式,主要用于解决多重继承中可能出现的 “钻石继承问题”。通过虚拟继承,可以确保派生类(即子类)只继承一次最顶层基类的成员,避免由于多次继承同一基类而导致的二义性、数据冗余以及状态不一致的问题。

小萌学习笔记 844

解释 C++ 中的虚拟继承(Virtual Inheritance)

虚拟继承是 C++ 中的一种特殊的继承方式,用于解决多重继承中的菱形继承问题。解决菱形继承问题:菱形继承问题是指在多重继承中,由于某个派生类间接继承了多个相同的基类,从而导致对这些基类成员的访问出现二义性。总的来说,虚拟继承是 C++ 中用于解决多继承带来的菱形继承问题的一种机制,通过共享基类子对象的方式来避免派生类中出现多个相同基类子对象,保证了派生类对象对基类成员的访问不会出现二义性。共享基类子对象:在虚拟继承中,派生类的对象只包含一个共享的基类子对象,而不是每个直接基类的子对象都被派生类所包含。

qiuyehuanghun的博客 1989

C++的类中的虚拟继承

C++中的虚拟继承(Virtual Inheritance)是一种特殊的继承方式,主要用于解决多重继承时可能出现的"菱形继承问题"(Diamond Problem)。这种继承机制通过virtual关键字实现,能让派生类只保留一份基类的实例,从而避免数据冗余和访问歧义。菱形继承问题的典型场景是:假设有一个基类A,两个派生类B和C都继承自A,然后类D又同时继承B和C。这样D中就会有两份A的成员,导致访问冲突。

Made In SQL 1015

C++:对象模型、虚拟继承与虚基表

继承方式与继承模型 单继承 子类只有一个父类 多继承 子类有多个父类 菱形继承 单继承和多继承的复合 子类对象模型,就是以继承成员变量的次序排序 多继承: 子类在继承多个父类时,每个父类前必须加继承权限,否则就是默认继承 菱形继承: D继承B1和B2,将变量a继承了两次,编译器就不知道变量a,是从B1中继承的,还是访问B2中继承的 应将29行代码修改为 stu.B1::a = 10;使用作用域限定,使访问明确化 成员函数也会出现二义性 菱形继承中二义性问题 →顶层父

qq_45481606的博客 435

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

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

林的最终章的博客 2755

C++:菱形继承问题

在C++中,菱形继承是指一个派生类同时继承自两个直接或间接基类,而这两个基类又继承自同一个基类。这种继承结构形成了一个菱形的图形,因此得名菱形继承。菱形继承可能会引起一些问题,其中最主要的问题是数据冗余。由于派生类继承了两个基类,这两个基类都可能包含相同的数据成员,导致派生类中存在两份相同的数据,造成数据冗余和浪费内存。单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承:菱形继承是多继承的一种特殊情况。

decade777555的博客 2597
上一篇: C++ 对象的内存布局(下)
下一篇: 深度探索C++对象模型
Superr爬爬虫
博客等级 码龄19年 72粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值