为什么C++需要虚继承

c++ 小知识点 初始化列表、 为什么析构函数声明为虚函数、为什么构造函数不能声明为虚函数、  虚继承的作用 1 初始化列表作用 1)初始化常量参数 常量成员不能在构造函数中赋值,只能使用初始化列表 class A { public: const int nIndex; A(int i) { nIndex=i; //编译不通过 错误 常量不能再构造函数中初始化 } } class A { public 阅读详情

先看个编译多继承带来的编译错误

/*************************************************************************
    > File Name: muti_inherit.cpp
    > Author: guoqingyao
    > Mail: stepbystepto@163.com 
    > Created Time: 2016年08月11日 星期四 12时38分35秒
 ************************************************************************/

#include<iostream>
using namespace std;
class A
 {
    public:
            int a;
};

class B : public A 
{
};

class C : public A 
{
};

class D : public B, public C 
{
};

int main()
{
    D d;
    d.a = 1;
    return 0;
}

编译错误

dotheright@dotheright:~/mylovelycodes/cpp/base/9$
g++ muti_inherit.cpp
muti_inherit.cpp: In function ‘int main()’:
muti_inherit.cpp:31:4: error: request for member ‘a’ is ambiguous
d.a = 1;
^
muti_inherit.cpp:13:6: note: candidates are: int A::a
int a;
^
muti_inherit.cpp:13:6: note: int A::a

这里出现的错误是d.a 有二义性,这时候我们就要找二义分别是指的什么?
变量a的一种继承关系

Created with Raphaël 2.1.0DDBBAA继承于继承于

变量a的另一种继承关系

Created with Raphaël 2.1.0DDCCAA继承于继承于

A 由两份copy 所以会有二义性,消除二义性就是A只留一份,需要用到虚继承

/*************************************************************************
    > File Name: muti_inherit.cpp
    > Author: guoqingyao
    > Mail: stepbystepto@163.com 
    > Created Time: 2016年08月11日 星期四 12时38分35秒
 ************************************************************************/

#include<iostream>
using namespace std;
class A
{
public:
    int a;
};

class B :virtual public A 
{
};

class C :virtual public A 
{
};

class D : public B, public C
{
};

int main()
{
    D d;
    d.a = 1;
    return 0;
}
单细胞实战之亚细胞分群从T/NK至CD4+T细胞——从入门到进阶(中级篇1) 亚细胞分群从T/NK至CD4+T细胞 阅读详情

相关推荐

手把手教你配置RK3588的FFmpeg+RKmpp:从解码到RGA转换的完整避坑指南

本文详细介绍了在RK3588平台上配置FFmpeg+RKmpp进行硬件解码和RGA图像处理的完整流程,包括环境准备、DRM Prime解码输出实战、RGA硬件加速转换技巧以及全链路性能调优。通过具体代码示例和问题排查指南,帮助开发者高效实现视频处理流水线,显著提升性能并降低CPU占用率。

weixin_28366475的博客 472

C++语法——详解虚继承

一.什么是虚继承所谓虚继承(virtual)就是子类中只有一份间接父类的数据。该技术用于解决多继承中的父类为非虚基类时出现的数据冗余问题,即菱形继承问题。,那么,当我们用D实例化对象调用a时,编译会报错,因为发生了混淆。除非指定类域B或C。当然指定A也可以,因为默认会从第一个父类中找。此时,D的实例化对象内部结构如下:而当我们使用虚继承时,结构是下图这样,D中只有一份父类A,当我们调用A中数据时,并不会发生冗余。

weixin_61857742的博客 3万+

嵌入式开发中Tab与空格混用的危害与统一规范实践

在软件工程中,代码格式一致性是保障可读性与团队协作效率的基础。从原理上看,制表符(Tab)与空格(Space)在存储与显示机制上存在本质差异:Tab是控制字符,其显示宽度取决于编辑器设置;空格则是固定宽度的字符。这种差异导致混用时会引发代码对齐错乱、版本控制冲突及跨平台兼容性问题,严重影响工程的可维护性。尤其在嵌入式开发领域,资源受限环境与高可靠性要求使得统一的编码规范更为关键。通过配置编辑器、集成clang-format等自动化工具,可以强制实现缩进风格的一致性,从而提升代码质量与团队协作效率。本文聚焦于

weixin_42545636的博客 275

重学C++系列之虚继承

如何解决C++中的多继承中基类成员重名,产生的二义性,虚继承你值得拥有。

AABond的博客 5071

x86架构学习之中断

外部中断,一般是由CPU的外部引脚电信号触发,这些引脚留给硬件厂商去定义中断,例如主板厂商可以将USB中断挂载70号中断引脚上,MCU厂商可以将片上外设(SPI、I2C等)的中断挂载在指定中断线上。中断描述符主要用于说明该中断的入口地址,中断描述符表则是将中断描述符一项一项管理在一个数组中,每一项中断描述符占用8个字节(64位模式下,占用16字节),其。简称中断,后文如果没特别说明,中断都指外部中断,由外部IO事件触发,由于时钟源来自CPU外部,与CPU时钟不同源,因此是异步事件。

qq_26962739的博客 1570

ESP32-S3双屏AI吊坠:微型边缘智能终端设计实践

边缘智能终端是指在设备端完成数据感知、处理与响应的嵌入式系统,其核心在于低延迟、高隐私与弱网适应性。基于ESP32-S3等轻量级主控,通过语音唤醒、本地AI推理与双屏异步渲染等关键技术,可构建资源受限场景下的实用化人机交互节点。这类设计显著降低对云端依赖,提升实时性与数据安全性,广泛应用于智能穿戴、IoT交互面板及便携式语音设备。本文以‘璀璨·AI吊坠’为实例,深入解析双面圆形屏驱动、ES8311音频链路优化、VAD+Porcupine本地语音流水线,以及亚微安级低功耗状态机实现,为微型AI终端的软硬协同开

weixin_42348783的博客 632

C++.继承——虚继承

C++.继承——虚继承

xiaoyu1381的博客 2393

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 384

C++虚继承和虚基类

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 图1

zzwdkxx的专栏 1274

杭电计算机组成原理课程设计-实验七-寄存器堆设计实验

寄存器堆实验实验原理实验内容模块功能说明模块逻辑引脚图寄存器堆模块代码REG模块测试用例REG-ALU测试用例实验结果记录 寄存器堆实验结果及分析ALU_REG运算器模块实验结果及分析探索与思考 实验原理   32×32位的寄存器堆模块示意图如图所示,含有32个寄存器,每个寄存器32位。该寄存器堆具有A和B两个读端口,分别由 5 位的寄存器编号 R_Addr_A 和 R_Addr_B 来寻址 2 个寄存器,读出的数据则由 R_Data_A(32 位)和R_Data_B(32 位)输出。读访问时,没有使能或者

HDU-整蛊小子-⏰☂️/蚂蚁集团研发工程师 1万+

无监督低照度增强实战:用ZeroDCE和SCI拯救你的夜间照片(附PyTorch代码)

本文深入探讨了无监督低照度图像增强技术,重点解析了ZeroDCE和SCI两大代表性模型的核心原理与实战应用。通过对比分析两者的技术路径、网络结构及性能特点,并附上详细的PyTorch代码实现,旨在帮助读者掌握无需配对数据即可有效提升夜间照片画质的深度学习解决方案。

git9versioner的博客 489

C++类的继承(虚继承)

C++中类的继承--虚继承和析构函数

沃和莱特的博客 2039

cadence17.4和16.6同时安装无法使用的问题

经过对报错的问题分析,发现还是17.4的lic文件和16.6的不一样,16.6的版本总是无法找到自己对应的lic文件。卸载了,重新单独安装16.6,这里就是正确的。包括使用这些工具去修复这些问题,都无法接近。已经放弃了,使用哪个版本就安装 哪个版本。这个也无法解决问题。

D_Katter的博客 2321

什么是 C++ 中的多继承?它有哪些优缺点?什么是虚继承?为什么要使用虚继承?

多继承会使类之间的关系变得复杂。例如,如果类 C 继承自类 A 和类 B,且 A 和 B 都有function成员,在类 C 中可以这样调用:A::function()或者B::function(),这增加了代码的复杂性和维护成本。例如,假设有类 A、类 B 和类 C,类 C 可以同时继承自类 A 和类 B,这就形成了多继承的关系。这意味着类 C 将继承类 A 和类 B 的所有非 - private 成员(包括成员变量和成员函数),类 C 的对象可以访问和使用从类 A 和类 B 继承来的这些成员。

2202_75941514的博客 2203

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

什么是 C++ 中的多继承?它有哪些优缺点? 什么是虚继承?为什么要使用虚继承?

在多继承中,如果多个基类中有同名成员,且没有使用虚继承,那么在派生类中访问该成员时可能会产生二义性。而通过虚继承,派生类对象中只有一份基类的子对象,避免了这种二义性。例如,一个图形绘制程序中,可能有一个表示形状的基类和一个表示颜色的基类,通过多继承可以创建一个既具有形状属性又具有颜色属性的具体图形类。当一个类以虚继承的方式继承基类时,在派生类的对象布局中,只会存在一份基类的子对象,而无论有多少条继承路径指向该基类。在 C++中,虚继承是一种继承方式,用于解决多继承时可能出现的重复继承同一个基类的问题。

SUN_Gyq的博客 1320

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

什么是 C++ 中的多继承?它有哪些优缺点?;什么是虚继承?为什么要使用虚继承?

多继承是 C++ 中一种允许一个类从多个基类继承属性和方法的机制。这意味着一个派生类(子类)可以同时获得多个基类(父类)的功能。优点代码复用:多继承允许类从多个基类继承,从而更有效地复用代码。灵活性:可以构建更复杂和灵活的类层次结构,满足多样化的设计需求。减少代码冗余:避免了在多个派生类中重复相同的代码。缺点菱形继承问题(也称为“钻石问题”):当一个类从多个基类继承,而这些基类又共享一个共同的基类时,会导致数据成员和成员函数的重复继承问题。这通常会导致二义性,需要特殊的处理(如虚继承)。复杂性增加。

rujiran的博客 385

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么虚继承会影响性能?剖析C++对象布局的隐藏代价

深入解析C++虚继承的内存布局,揭示多继承下性能损耗根源。适用于复杂类层次设计场景,通过对比普通继承与虚继承的内存开销,剖析vptr机制与对象模型变化。掌握底层原理以优化程序效率,值得收藏。

CodePulse的博客 369

C++中虚继承为什么可以解决菱形继承的数据冗余问题

在C++中菱形继承会有数据冗余的问题发生,我们可以使用虚继承来解决,那虚继承的原理是什么,为什么它可以解决这个问题。

weixin_58234579的博客 471

java 虚继承_c++设计一个不能被继承的类,为什么必须是虚继承?原因分析

用C++实现一个不能被继承的类(例1)#includeusingnamespacestd;templateclassBase{friendT;private:Base(){cout<}~Base(){}};classB:virtualpublicBase{//一定注意必须是虚继承public:B(){cout<}};classC:publicB{pub...

weixin_42168230的博客 171

c++设计一个不能被继承的类,为什么必须是虚继承?原因分析

用C++实现一个不能被继承的类(例1) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2

zdy0_2004的专栏 633

C++虚继承实现机制详解:为什么它能解决菱形继承中的重复基类问题?

深入解析C++菱形继承与虚继承解决方法,揭示虚继承如何通过共享基类实例避免重复继承问题。涵盖多继承场景、vptr布局优化及内存结构变化,提升程序稳定性与效率。机制清晰易懂,值得收藏。

PixelFlow的博客 461

C++菱形继承的坑:为什么你的Assistant对象有两份_age?手把手教你用虚继承解决

本文深入解析C++菱形继承问题,揭示Assistant对象存在两份_age成员的原因,并提供虚继承的解决方案。通过代码示例和内存布局分析,详细讲解虚基表的工作原理及实现要点,帮助开发者避免数据冗余和访问二义性问题,提升代码质量与性能。

h6j7k8l9p0的博客 901

C++虚继承虚基类虚函数纯虚函数总结

对于这些虚的,之前有很多歧义和不解,现在进行一下学习总结吧! 1.多重继承可能会导致二义性,而虚继承可以解决这个问题。虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态,在虚继承下给定虚基类无论该类在派生层次中作为虚基类出现几次,只继承一个共享的基类的对象。共享的虚基类子对象就是虚基类。 例如: class istream:public virtual ios{}; class

u011700461的博客 2860
上一篇: 代码检视九句箴言
下一篇: bit翻转
do-the-right
博客等级 码龄15年 16粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值