当前位置: 首页 > news >正文

C++ virtual public(虚继承类)

     这个"virtual"有什么作用?

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

典型的需要用虚基类的情况如下:

其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承,即多继承中经常提到的“菱形结构”。

#include<stdio.h>
class A
{
public:void Echo()   {   printf( "Echo");} 
}; class B: public A
{
};class C: public A
{
};class D: public B, public C
{
};void main() 
{ D d; d.Echo();   //   出现错误.此处函数调用不明确. 
} 

此时调用d.Echo(),就会有二义性问题,编译器会报Echo函数调用不明确,如下:

如果将B、C类改为像如下那样从A类虚拟继承,则不会存在有二义性问题,编译器不会报错。

#include<stdio.h>
class A
{
public:void Echo()   {   printf( "Echo");} 
}; class B: public virtual A
{
};class C: virtual public A
{
};class D: public B, public C
{
};int main() 
{ D d; d.Echo();   //  正确,编译器不会报错. return 0;
} 

说明:public virtual写成virtual public也是可以的,即public、 virtual关键字谁在前谁在后都行。

相关文章:

  • 从人、机器和环境角度解决智能安全问题
  • 绘制MySQL数据库的实体关系图(ERD)与逻辑模型图
  • 费曼的博士学位论文及下载
  • 前端 CSS 经典:好用的 CSS 选择器
  • 【云】各家云服务器介绍
  • 开源新纪元:ChatTTS——引领对话式文本转语音的新潮流
  • Java学习 - MySQL数据存储过程 + 函数 + 触发器介绍实例
  • ES6 .entries用法
  • WordPress模板推荐
  • python GUI开发: tkinter事件处理的几种方式详解与应用实战
  • 【数据库编程-SQLite3(二)】API-增删改查基础函数-(含源码)
  • Linux下Shell脚本基础知识
  • 2024数据库期末综合解析(部分题)
  • Docker 安装 MySQL5.7 和 MySQL8
  • 10.Docker Compose容器编排
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • If…else
  • JavaScript-Array类型
  • PHP 的 SAPI 是个什么东西
  • ReactNative开发常用的三方模块
  • swift基础之_对象 实例方法 对象方法。
  • 反思总结然后整装待发
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 两列自适应布局方案整理
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 移动端唤起键盘时取消position:fixed定位
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #android不同版本废弃api,新api。
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $.each()与$(selector).each()
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (7)svelte 教程: Props(属性)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)socket Aio demo
  • (转载)OpenStack Hacker养成指南
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET 4.0中的泛型协变和反变
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Micro Framework初体验(二)
  • .NET 表达式计算:Expression Evaluator
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)