C++虚继承:virtual public CParent

C++ 多重继承的virtual public的含义 这个"virtual"有什么作用? 由于C++支持多重继承,所以对于一个派生类中有几个直接父类, 而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类), 这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况, 就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数), 为解决此问题,需要使用虚基类, 即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了 典型的需要用虚基类的情况如下: 其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承 代码示例 阅读详情

    今天在读《高质量程序设计指南--C/C++语言》第12章讲关于继承的例子12-9时,看到了:

class Socket

{

.........

}

 

class SocketImpl : virtual public Socket

{

.........

}

 

class ClientSocket : virtual public Socket

{

........

}

 

class ClientSocketImpl : public ClientSocket,private SocketImpl

{

........

}

这里实现了多重继承。一开始不明白此处virtual的用处,经过网上查阅,了解了一些,总结一下:

这个"virtual"是什么作用及含义?
证明这个SocketImpl、ClientSocket是Socket 的虚基类。

虚基类的作用:
虚基类是指:class SubClass : virtual public BaseClass 中以virtual声明的基类。由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了。


典型的需要用虚基类的情况如下:
            A
           / /
          B   C
           / /
            D
其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承。一开始所讲述的就是一个很好的例子。

当ClientSocketImpl构造出来后,它的存储区域中只有一个Socket,不存在二义性问题。这是讲叙的最基本的意思。要想深入理解,网上有很多很好的文章,由于水平太菜,很多看不大很明白,暂时只好浅显的理解一下了。

如:参考百度文库--C++虚继承对象的内存布局:
http://wenku.baidu.com/view/a516063567ec102de2bd894f.html 

陈皓的《C++ 对象的内存布局》图文并貌,写得很是详细。地址是http://blog.youkuaiyun.com/haoel/archive/2008/10/15/3081328.aspx

玄机逸士的《对象内存布局》系列则几乎把每种可能性列出来了,尤为详尽。地址是http://blog.youkuaiyun.com/pathuang68/archive/2009/04/23/4101970.aspx

关于c++中的virtual继承的总结 1.在什么时候需要虚拟集成呢? 阅读详情

相关推荐

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码)

本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。

weixin_26950847的博客 264

C#虚拟与抽象方法详解

本文详细讲解了C#中virtual(虚拟)和abstract(抽象)的区别与用法。虚拟方法使用virtual关键字修饰,允许子类选择性重写,必须包含方法体;而抽象方法使用abstract关键字修饰,没有方法体,强制子类必须重写。文章通过代码示例展示了虚拟方法和抽象方法的定义方式、子类重写规则及调用方式,并总结了11点主要区别,包括关键字不同、实现要求不同、实例化限制等。虚拟方法提供可选重写,抽象方法则强制重写,这是两者最核心的差异。

莫踌躇 7580

从时序迷宫到稳定通信:FSMC配置中的时间参数深度解析与实战避坑指南

本文深入解析STM32 FSMC配置中的时间参数,特别是AddressSetupTime和DataSetupTime的实战配置技巧。通过STM32F407连接SRAM的实际案例,提供从理论计算到CubeMX配置的全流程指南,帮助开发者避免常见时序陷阱,确保稳定通信。

nginx7reverse的博客 82

virtual public(虚继承类)

在类重载中我们一般使用以下的方式:  class   Base  {      void   Echo()   {   printf( "Echo   from   Base ");}  };  class   Middle   :   public   Base   {}  class   Child   :   public   Middle   {}  可以很清

Bolun_Li的专栏 4958

BIOS更新后PIN不可用怎么办?从原理到实操的完整修复指南

在计算机维护中,BIOS更新是常见的固件升级操作,但其引发的登录异常却常让用户措手不及。Windows Hello PIN并非传统密码,它通过TPM芯片与设备启动环境(PCR状态)强绑定,一旦主板固件或安全启动配置改变,TPM便会拒绝释放密钥,导致“由于此设备上的更改,你的PIN不再可用”。理解这一原理后,恢复路径清晰可控:优先尝试密码登录,或通过WinRE替换utilman.exe创建临时管理员,必要时还需处理BitLocker恢复密钥。本文面向系统维护与数据安全场景,系统梳理PIN失效的恢复流程与避坑方

weixin_31364787的博客 371

LDRA Testbed软件静态分析_常见问题及处理

通过前面的几篇文章,LDRA Testbed软件静态分析的内容基本讲解完了,本篇文章将针对使用Testbed进行软件静态分析的常见问题进行介绍。 到此为止,LDRA Testbed软件静态分析的内容已经全部讲完,如果有问题,欢迎私信提问(不经常登录,回复可能不及时,见谅)。下一篇文章将开始讲解如何使用Testbed进行单元测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2589

c++ private、protect、public、virtual详细说明***

今天遇到有些同事居然对这些关键字的权限等还不是特别了解,容易弄混淆,今天总结下。 private: 私有控制符。这类成员只能被本类中的成员函数和类的友元函数访问。 protected: 受保护控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可以被派生类的成员函数和派生类的友元函数访问。 public: 共有控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可...

随意的风的专栏 6997

Ambari 3.0+BigTop 3.3集群部署实战

Ambari 3.0+BigTop 3.3集群部署

docsz的博客 609

C++ 多重继承 virtual public(虚继承类

c++的关键字虚基类,irtual关键字用于支持运行时多态性,它是实现动态绑定(dynamic binding)的关键。virtual关键字主要用于类的成员函数声明中,允许在派生类中重写(override)基类的函数,并确保通过基类的指针或引用来调用函数时,会调用到正确类型的对象所对应的函数版本。顺序可以改变,虚基类(Virtual Base Class) ,虚基类(Virtual Base Class)是C++中用于解决多重继承中“菱形继承”问题的一种机制。

hanwei020502的博客 903

置顶必读(1) | 滚雪球学Oracle教程导航帖,带你弯道超车(持续更新中)

什么是数据库管理系统(DBMS),Oracle在行业中的领先地位Oracle数据库的市场竞争与主要应用场景Oracle数据库的核心功能模块与未来技术发展趋势约束的高级应用:主键、唯一性、外键设计与管理表分区、视图、同义词与序列的最佳实践PL/SQL编程的设计哲学,如何高效使用Oracle SQL DeveloperPL/SQL代码调试与优化技巧RAC集群中的高可用性设计,负载均衡与并行查询的配置集群中的缓存一致性管理。

**My Coding Family** 1万+

Android 14.0 首次开机默认授予app运行时权限(去掉运行时授权弹窗)

在14.0的系统rom产品定制化开发中,在6.0以后对于权限的申请,都需要动态申请,所以会在系统首次启动后,在app的首次运行时, 会弹出授权窗口,会让用户手动授予app运行时权限,在由于系统产品开发需要要求默认授予app运行时权限,不需要用户默认授予运行时弹窗,所以需要在首次开机默认授予所有app运行时权限

安卓兼职framework和app工程师的博客 2531

C++虚继承:virtual public CParent的含义及作用

Question: 父类: class CParent { .... }; 继承类的声明比较特别: class CChild : virtual public CParent { .... } 请问,这个"virtual"是什么作用及含义? ---------------------------------------------------------------

867

【Unity的HDRP渲染管线下用Steam VR串流结合使用遇到的各种问题_SteamVR 插件和Pico串流助手】

当你启用"Mock Runtime"选项后,Unity将模拟一个虚拟的OpenXR运行时环境,并提供一些虚拟的设备和功能,让你能够进行开发和调试。在Unity中,SteamVR插件是一个由Valve提供的Unity插件,它允许开发者在Unity项目中集成SteamVR功能,以便支持SteamVR设备。OpenXR是一个跨平台的虚拟和增强现实(VR/AR)开发接口,它为开发者提供了一个统一的接口,用于访问不同VR/AR硬件设备和平台的功能。这个选项是用于模拟OpenXR运行时环境的功能。

暴走约伯的博客 2800

virtual public CParent的含义及作用——虚基类

表示虚拟继承,和普通继承是C++的两种多重继承方式。 例如CB1、CB2 继承CA 而CC多重继承CB1、CB2 如果普通继承则CC包含两份CA的拷贝,分别来自于CB1、CB2 而虚拟继承则指包含一份CA的拷贝

今世进士尽是近视 853

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++继承分析

面向对象的三大特性之一就是继承,继承运行我么重用基类中已经存在的内容,这样就简化了代码的编写工作。继承中有三种继承方式即:public protected private,这三种方式规定了不同的访问权限,这些权限的检查由编译器在语法检查阶段进行,不参与生成最终的机器码,所以在这里不对这三中权限进行讨论,一下的内容都是采用的共有继承。单继承首先看下面的代码:class CParent { public

Masimaro的专栏 2256

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++ virtual public(虚继承类)

由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了。如果将B、C类改为像如下那样从A类虚拟继承,则不会存在有二义性问题,编译器不会报错。其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承。

danshiming的博客 905

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++中virtual继承的深入理解

转自:https://www.cnblogs.com/weekbo/p/8384943.html 今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下: 父类: 复制代码代码如下: class CParent { .... };继承类的声明比较特别: class CChild : virtual public CParent { .... } 请问,这个"virtual"是什么作用及含义? ---------------------------...

qqwangfan的专栏 2973

virtual public 含义

在类重载中我们一般使用以下的方式:  class   Base  {      void   Echo()   {   printf( "Echo   from   Base ");}  };  class   Middle   :   public   Base   {}  class   Child   :   public   Middle   {}  可以很清

kkk328的专栏 7735

C++虚函数、虚继承:virtual

如果基类的虚函数,在派生类当中没有重新定义,那么还是会使用基类当中的该函数。

Dream_No_More的博客 1483

C++中的多重继承

多重继承:一个派生类有多个基类 虚基类 class A { public: protected: int ma; }; class B :virtual public A {//虚继承,类A称为虚基类 public: private: int mb; }; 通过命令提示输入cpp文件路径/cl cpp文件名.cpp/dlreportSingleClassB 来查看当前类B内存状况 虚基类数据保存在了派生类的最末尾,类的起始部分生成一个vbptr,指向vbtable。vbtable第一行是vbptr向

the_lane的博客 390

public virtual

虚继承类

Edidaughter的博客 1101

c++中的private/protect/public & virtual

private: 私有控制符。这类成员只能被本类中的成员函数和类的友元函数访问。 protected: 受保护控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可以被派生类的成员函数和类的友元函数访问。 public: 共有控制符。这类成员可以被本类中的成员函数和类的友元函数访问,也可以被类作用域内的其他函数引用。 virtual: C++通过虚函数实现多态."无论发送消息

Yolanda的专栏 7887

C++中的虚函数与多态

1 虚函数与虚函数表 虚函数:用virtual修饰的成员函数 虚函数表:就是一个指针存储所有虚函数的首地址 #include <iostream> using namespace std; class student { public: void print()//普通函数不影响类的内存 { cout << "普通函数" << endl; } virtual void print1()//虚函数类的内存增加,不论几个增加不变 {//32...

小狐狸的博客 420

彻底弄懂C++虚拟继承

为了解决普通继承的“数据冗余”和“二义性”的问题,C++引入了虚拟继承使得在多重继承下,基类成员只继承一份。 这篇博客主要解析1.虚拟继承机制,如何做到的? 2.它和普通继承有什么区别?3.虚拟继承同时满足多态会怎样? .........

weixin_44212838的博客 1万+

C#开发之——virtual关键字(6.8)

一 概述 C#中virtual是虚拟的含义,在C#语言中,默认情况下类中的成员都是非虚拟的,通常将类中的成员定义成虚拟的,表示这些成员将会在继承后重写其中的内容 virtual关键字能够修饰方法、属性、索引器以及事件,用到父类的成员中 <!--more--> 二 virtual 语法形式 2.1 语法形式 2.1.1 使用virtual关键字修饰属性语法形式 <span style="color:#333333">//修饰属性 public virtu

我的博客 1317
上一篇: C++ sizeof 使用规则及陷阱分析
下一篇: 了解C++中的RTTI
sdudubing
博客等级 码龄16年 117粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值