当前位置: 首页 > 编程日记 > 正文

一个虚函数和虚继承的问题。

这个问题困惑好几天了。废话不多说,先上代码。

  1 #include <iostream> 
2 using namespace std;
3
4 class A
5 {
6 public:
7 virtual void aa()
8 {
9 }
10 private:
11 char k[3];
12 };
13
14 class B:public A
15 {
16 public:
17 virtual void bb()
18 {
19 }
20 private:
21 char j[3];
22 };
23
24 class C:public B
25 {
26 public:
27 virtual void cc()
28 {
29 }
30 private:
31 char i[3];
32 };
33
34 int main()
35 {
36 A a;
37 B b;
38 C c;
39 cout<<"sizeof(A):"<<sizeof(A)<<endl;
40 cout<<"sizeof(B):"<<sizeof(B)<<endl;
41 cout<<"sizeof(C):"<<sizeof(C)<<endl;
42 return 0;
43 }
44
45 打印结果:
46 sizeof(A):8//A有一个_vfptr的指向虚表的指针(4字节),加上char[3]补足是8字节。
47 sizeof(B):12//B继承A的全部(8字节),那加上char[3]补足一共是12字节,使用继承自A的_vfptr指向B的虚表
48 sizeof(C):16//同B的情况,都用A的虚函数表指针指向虚函数表。
49
50 但是如果 B、C虚继承自A
51 #include <iostream>
52 using namespace std;
53
54 class A
55 {
56 public:
57 virtual void aa()
58 {
59 }
60 private:
61 char k[3];
62 };
63
64 class B:virtual public A
65 {
66 public:
67 virtual void bb()
68 {
69 }
70 private:
71 char j[3];
72 };
73
74 class C:virtual public B
75 {
76 public:
77 virtual void cc()
78 {
79 }
80 private:
81 char i[3];
82 };
83
84 int main()
85 {
86 A a;
87 B b;
88 C c;
89 cout<<"sizeof(A):"<<sizeof(A)<<endl;
90 cout<<"sizeof(B):"<<sizeof(B)<<endl;
91 cout<<"sizeof(C):"<<sizeof(C)<<endl;
92 return 0;
93 }
94
95 在VS2008下打印结果为:
96 sizeof(A):8
97 sizeof(B):20
98 sizeof(C):32
99 而在GCC编译下,打印结果为:
100 sizeof(A):8
101 sizeof(B):16
102 sizeof(C):24
103
104 这是怎么得到的呢?
105

关于虚继承这个问题,以下有几种不同的回复,上截图:

另一种:

显然,MS的VS在这方面做了一些优化,跟其他编译器相比,在派生类中插入了一个偏移值表的指针,也就多了4个字节。

通过派生类来访问虚基类的上一个从偏移值表里的获得的偏移量。VS下的内存布局如下:


|C的虚函数表指针|C的偏移表指针|C的成员变量|A的虚表指针|A的成员变量|B的虚函数表指针|B的偏移表指针|B的成员变量 。 MS为什么通过偏移表来对虚基类的成员进行寻址,我还不晓得。

现在就把摘抄的写到这里。

=我弄明白,补上。

转载于:https://www.cnblogs.com/kanego/archive/2011/11/06/2238339.html

相关文章:

Linux性能分析命令工具汇总

转自&#xff1a;http://rdc.hundsun.com/portal/article/731.html?refmyread出于对Linux操作系统的兴趣&#xff0c;以及对底层知识的强烈欲望&#xff0c;因此整理了这篇文章。本文也可以作为检验基础知识的指标&#xff0c;另外文章涵盖了一个系统的方方面面。如果没有完善…

【jsp】使用get方法传值的格式

get:通过地址提交 格式&#xff1a; http://192.168.7.45:7002/jsp29/doAddStu.jsp?stuNo20181013123&stuName%E5%B0%8F%E5%BC%BA&gender0&age19&major%E7%94%B5%E5%AD%90%E5%B7%A5%E7%A8%8B&score650 即&#xff1a;网址?参数名值&参数名值

指针02 - 零基础入门学习C语言42

第八章&#xff1a;指针02 让编程改变世界 Change the world by program 对“&”和“*”运算符再做些说明 如果已执行了语句 pointer_1 &a; (1) &*pointer_1的含义是什么&#xff1f; “&”和“*”两个运算符的优先级别相同&#xff0c;但按自右而左方向结…

java算法----排序----(6)希尔排序(最小增量排序)

1 package log;2 3 public class Test4 {4 5 /**6 * java算法---希尔排序&#xff08;最小增量排序&#xff09;7 * 8 * param args9 */ 10 public static void main(String[] args) { 11 // 需要排序的数组 12 int arr[] { 49, …

你知道dos和cmd之间的关系以及区别吗?

含义 dos 英文disk operation system&#xff0c;意思是磁盘操作系统是微软系列操作系统之一&#xff0c;dos是一个独立的操作系统&#xff0c;dos对操作人员的要求是比较高的&#xff0c;操作者需要记住很多的命令&#xff0c;并利用命令编写大量的命令行&#xff0c;来完成一…

挨踢项目求生法则-团队建设篇

摘要&#xff1a; 知道什么是挨踢项目吧&#xff1f;什么&#xff01;不知道&#xff1f;那IT项目知道了吧&#xff1f;为了不让客户踢、不让老板踢、项目组成员之间不互相踢&#xff0c;俺为大家分享一些减少被踢机会的心得体会。就算不能让项目成功&#xff0c;也至少不会死得…

【jquery】文档操作

属性 1、attr() 获取、设置属性、设置多个属性 代码实现&#xff1a; alert($("div:first").attr("value")); $("div:first").attr("value","这是第一个div"); $("div:last").attr({value: "这是最后一…

基于流式的md5计算-多线程下载工具Lwget介绍

在数据传输的时候&#xff0c;我们希望实现以下目标&#xff1a;1. 使用多线程传输&#xff0c;加速下载速度2. 数据在传输过程中,进行流式md5计算&#xff0c;避免在传输完毕之后校验大文件3. 支持断点续传4. 支持http协议和ftp协议5. 代码尽可能的简单&#xff0c;利于维护 实…

SpringCloud系列一:SpringCloud的简介和架构

声明&#xff1a;本文来源于MLDN培训视频的课堂笔记&#xff0c;写在这里只是为了方便查阅。 一、SpringCloud简介 SpringCloud就是一套分布式服务治理的框架&#xff0c;既然它是一套服务治理的框架&#xff0c;那么它本身不会提供具体功能性的操作&#xff0c;更专注于服务之…

SUST_ACM_2019届暑期ACM集训热身赛题解

问题A:Hello SUST! 知识点&#xff1a;基本输入输出 C/C&#xff1a; 1 #include <stdio.h>2 3 int main() {4 int n;5 scanf("%d", &n);6 while(n --) {7 printf("Hello SUST!\n");8 }9 return 0; 10 } View Code问…

修改默认的个人站点

1、将模板页加入到里面 在地址C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\MySiteLayouts中找到 LayoutFiles.xml 然后将master复制到这个文件夹下 最后在LayoutFiles.xml加入如下代码&#xff1a; <Module Name"Mast…

【java】暑期需要复习的操作

实现分页查询 将网页输入的数据存入数据库 将每个jsp文件都需要的代码抽离出来 添加jquery 全选操作 引入jstl 实现全选功能

11迭代器模式

图片来自head first 设计模式&#xff0c;仅供学习之用 事实证明光看是没有用的&#xff0c;实践才能出真知&#xff0c;迭代器模式没有我想想的那么简单&#xff0c;写了个小例子才发现自己的理解并不深刻。例子是仿照head first的。迭代器是一个完整的类&#xff0c;作用是遍…

吴裕雄--天生自然 高等数学学习:高阶偏导数

转载于:https://www.cnblogs.com/tszr/p/11165379.html

【数据库】兴唐第二十六节课作业

一、设计购物车表、支付信息表和订单表 思路&#xff1a; 购物车中有&#xff1a; 商品名、价格、生产日期、 保质期&#xff08;shelf life&#xff09;、生产厂家。 支付信息中有&#xff1a; 商品名、 价格、 件数、 总价 订单信息有&#xff1a; 发货时间、订单号、预计到…

递归与非递归转换(栈知识应用)

下面例题是一次作业中遇到的&#xff0c;很值得体味&#xff0c;与大家共享下。 递归代码&#xff1a; 1 long f(long m,long n) 2 { 3 long sum; 4 if(m0) sumn1; 5 else if(n0) sumf(m-1,1); 6 else kf(m-1,f(m,n-1)); 7 return sum; 8 } 用递归来做很明了&a…

Silverlight 游戏开发小技巧:角色升级特效

这次我们将使用Projection完成一些有趣的RPG游戏中常用的特效&#xff1a;升级和传送点特效&#xff0c;我们不需要请特效师制作复杂绚丽的特效&#xff0c;而是只需要他们提供关键的几张图片或者设计样式&#xff0c;如果了您有本领教会他们使用Blend来做特效&#xff0c;那就…

使用jQuery开发messager消息框插件

1、插件使用 首先引入jquery库&#xff0c;然后引入dialog.js、dialog.css、messager.js、messager.css&#xff0c;如下&#xff1a; 1 <script type"text/javascript" src"js/jquery/jquery-1.7.2.min.js"></script> 2 3 <script type&q…

Data - 深入浅出学统计 - 上篇

本文是已读书籍的内容摘要&#xff0c;少部分有轻微改动&#xff0c;但不影响原文表达。 &#xff1a;以漫画形式来讲解最基本的统计概念和方法。 ISBN: 9787121299636https://book.douban.com/subject/26906845/引言&#xff1a;统计无处不在 统计值无处不在。我们伴随着统计值…

android 布局之RelativeLayout(相对布局)

android 布局分为LinearLayout TableLayout RelativeLayout FreamLayout AbsoluteLayout. 常用的有LinearLayout,TableLayout,RelativeLayout &#xff0c;这几个布局不会应该手机屏幕大小而有变化。通常我们使用HVGA 大小的屏幕(320*480). 接下来我们学习RelativeLayout. 原文…

【js】实现分页查询操作的步骤

1、将CSS的代码复制到goodList.jsp 2、引入common 代码实现&#xff1a; <% include file"../common/common.jsp"%> 3、引入jstl 代码实现&#xff1a; <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%> 注意&…

Orchard:如何生成Hello World模块

在Orchard架构介绍中对Orchard的一些架构内容进行了介绍&#xff0c;下图是Orchard自带的一些模块&#xff0c; 本篇讲解一下如何扩展Orchard来生成我们的第一个模块。 介绍 Orchard构建在ASP.NET MVC之上&#xff0c;MVC是一个应用模式&#xff0c;我在信息系统开发平台OpenE…

通过域名访问自己部署到服务器上的项目

通过域名访问自己部署到服务器上的项目 如何不输入项目名端口号直接访问java web项目 1、省略输入端口号的步骤 在Linux的下面部署了tomcat&#xff0c;为了安全我们使用非root用户进行启动&#xff0c;但是在域名绑定时无法直接访问80端口号。众所周知&#xff0c;在unix下&am…

【java】异常的分类

注&#xff1a; 1、exception是人工可以修复的&#xff0c;但error的话很少出现&#xff0c;如果出现就无能为力了。 2、我们将所有派生于EXCEPTION和ERROR的类的所有异常称为&#xff08;unchecked&#xff09;非受查异常&#xff0c;其余为受查&#xff08;checked&#xf…

【免费软件测试视频-0013】——Loadrunner9.0 SLA Analysis

LR9.0---SLA Analysis http://www.3atesting.com/mv/bencandy.php?fid15&id16转载于:https://www.cnblogs.com/umain/archive/2008/09/28/1301310.html

训练听力的相关方法

一、听写熟悉一些固定发音 二、多阅读相关的文章&#xff0c;文章相关内容越熟悉&#xff0c;听力效果越好【重要】 三、首先没有听懂的一些音不会影响后面的理解 四、解决口音问题的唯一方法是&#xff0c;多阅读、记忆相关内容【签证及联系教授也要注意】转载于:https://www.…

PHP生成PDF文档的FPDF类

以前在PHP4的早期版本中用PDFlib生成PDF文档比较容易&#xff0c;现在升级到PHP5了&#xff0c;发现更麻烦了&#xff0c;装的PHP 5.2.4默认没有PHPlib&#xff0c;从php.net上找了一个&#xff0c;装上竟一直报错&#xff0c;开始以为是版本兼容问题&#xff0c;后来在租来的服…

Codeforces Round #466 (Div. 2)

http://codeforces.com/contest/940 A水题 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tunenative") //#pragma …

WinCE中串口驱动及接口函数介绍(转载)

作者&#xff1a;ARM-WinCE 在WinCE中&#xff0c;串口驱动实际上就是一个流设备驱动,具体架构如图&#xff1a; 串口驱动本身分为MDD层和PDD层。MDD层对上层的Device Manager提供了标准的流设备驱动接口(COM_xxx)&#xff0c;PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操…

【jsp】写jsp文件的准备

1、引入jstl 代码实现&#xff1a; <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core" %> 2、编写common文件 代码实现&#xff1a; <c:set var"ctxpath" value"${pageContext.request.contextPath }">&l…