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

C++虚继承

虚继承

虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。

底层实现原理与编译器相关,一般通过虚基类指针虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。

实际上,vbptr 指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class A  //大小为4
 5 {
 6 public:
 7     int a;
 8     double b;
 9 };
10 //在32位环境下,大小为12,变量a,b共8字节,虚基类表指针4;
11 //在64位环境下,变量a 4个字节,b 4个字节,虚基类表指针8个字节,为了对齐,大小总共24
12 class B :virtual public A  
13 {
14 public:
15     int b;
16 };
17 
18 //与B一样
19 class C :virtual public A 
20 {
21 public:
22     int c;
23 };
24 
25 //在32位环境下,大小为24,变量a,b,c,d共16,B的虚基类指针4,C的虚基类指针
26 class D :public B, public C 
27 {
28 public:
29     int d;
30 };
31 
32 int main()
33 {
34     cout << sizeof(A) << endl;
35     cout << sizeof(B) << endl;
36     cout << sizeof(C) << endl;
37     cout << sizeof(D) << endl;
38     cout << sizeof(void *) << endl;
39 
40     system("pause");
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/whutao/p/10383862.html

相关文章:

  • L3-009 长城 (30 分)
  • 股票
  • 如何创建一个Asp .Net Web Api项目
  • RAID LVM ISCSI
  • 在采用vue-cli Post Get
  • Linux的常识
  • P1606 [USACO07FEB]白银莲花池Lilypad Pond
  • Galera Cluster——一种新型的高一致性MySQL集群架构
  • KM模板
  • POJChallengeRound2 Tree 【数学期望】
  • 【BZOJ5291】[BJOI2018]链上二次求和(线段树)
  • 读书笔记--《编写高质量代码:改善Python程序的91个建议》
  • Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
  • volatilesynchronizeddiff
  • canvas字体样式
  • Google 是如何开发 Web 框架的
  • CAP 一致性协议及应用解析
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • git 常用命令
  • Go 语言编译器的 //go: 详解
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Less 日常用法
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python利用正则抓取网页内容保存到本地
  • Redis的resp协议
  • vagrant 添加本地 box 安装 laravel homestead
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 第2章 网络文档
  • 后端_ThinkPHP5
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 微服务核心架构梳理
  • 我有几个粽子,和一个故事
  • 携程小程序初体验
  • 新手搭建网站的主要流程
  • 自制字幕遮挡器
  • ​MySQL主从复制一致性检测
  • ​如何防止网络攻击?
  • ​什么是bug?bug的源头在哪里?
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)(1.13) SiK无线电高级配置(五)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第二周)效能测试
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)SpringBoot3---尚硅谷总结
  • (转)视频码率,帧率和分辨率的联系与区别
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***通过什么方式***网吧
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .Net Remoting常用部署结构