测试代码


#include <stdio.h>
struct AA
{
char b;
char b1;
int b3;
char b2;
};
class A
{
public:
A() { b = 'a'; }
A(char c){
b = c;
printf("build A:%c\n",c);
}
char b;
char a;
char c;
};
class B :virtual public A
{
public:
B():A('B'){
printf("build B\n");
b = 'b';
a = 'b';
}
char b;
};
class C :virtual public A
{
public:
C() :A('C') {
printf("build C\n");
b = 'c';
a = 'c';
}
char b;
};
class D :public C, public B,public A
{
public:
};
int main(int argc, char* argv[])
{
D d;
printf("%d\n", sizeof(struct AA));
printf("%d\n", sizeof(A));
printf("%d\n", sizeof(B));
printf("%d\n", sizeof(C));
printf("%d\n", sizeof(D));
printf("%c %c %c\n",d.A::b, d.B::b, d.C::b);
printf("%c %c\n", d.B::a, d.C::a);
return 0;
}
build C         #按继承顺序调用构造函数
build B
12 #结构体按最大字节对齐(可能的值有8,4,2,1) double 8 float int 指针 4 short 2 char 1
3 # 3个char --- 用1对齐 1+1+1=3
11 # 虚继承A的3个char(虚继承的类没有内存对齐) 1个虚地址指针 1个char --- 用4对齐 3+4+4=11
11 # 同上
23 # 虚继承A的3个char B类的1个指针和1个char C类的1个指针和1个char A类3个char --- 用4对齐 3+(4+4)+(4+4)+4=23
a b c # 'a' 是从A中继承的b,可以通过d.B::A::b访问通过B继承的A中的B
b b # 虚继承共享A类内存,所以值相同,因为B后继承,构造函数后调用,所以输出'b'

自己尝试,留个记录

C++ 从内存的角度,学习虚继承机制的更多相关文章

  1. C++多重继承分析——《虚继承实现原理(虚继承和虚函数)》

    博客转载:https://blog.csdn.net/longlovefilm/article/details/80558879 一.虚继承和虚函数概念区分 虚继承和虚函数是完全无相关的两个概念. 虚 ...

  2. C++ 虚继承实现原理(虚基类表指针与虚基类表)

    虚继承和虚函数是完全无相关的两个概念. 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝.这将存在两个问题:其一,浪费存储空间:第二,存在二义性问题,通常可 ...

  3. C++学习笔记-继承

    类之间可以建立联系,这就使得类可以有某种关系 类之间的关系 has-A:包含关系,一个类使用另一个已经定义好的类的数据 uses-A:使用关系,友元或者对象参数传递 is-A:是的关系,这就是继承,具 ...

  4. C++ 多继承和虚继承的内存布局(转)

    转自:http://www.oschina.net/translate/cpp-virtual-inheritance 警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中,我们 ...

  5. C++ 继承之虚继承与普通继承的内存分布

    仅供互相学习,请勿喷,有观点欢迎指出~ class A { virtual void aa(){}; }; class B : public virtual A { ]; //加入一个变量是为了看清楚 ...

  6. 虚继承之单继承的内存布局(VC在编译时会把vfptr放到类的头部,这和Delphi完全一致)

    C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼.虚函数与虚继承有哪些特性,今天就不记录了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内 ...

  7. 转载:C++ 多继承和虚继承的内存布局

    C++ 多继承和虚继承的内存布局[已翻译100%] 英文原文:Memory Layout for Multiple and Virtual Inheritance 标签: <无> run_ ...

  8. (C/C++学习)5.C++中的虚继承-虚函数-多态解析

    说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...

  9. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

随机推荐

  1. while & do-while

    while的形式——while(条件表达式){循环体:} 当满足条件表达式时,执行循环体,之后继续验证是否满足条件表达式,满足继续执行循环体,之后重复,直到不满足条件表达式,循环结束.    先判断, ...

  2. 51nod 1196

    题目 神犇题解:见题目讨论区曹鹏神犇的讲解. 跪烂..倒地不起.. 对于每一个合法解,我们都可以将其唯一地分解成若干个“链”.所谓链是指由那些小于n/2的字符组成的,并且最后一个字符满足2*i> ...

  3. 算法(Algorithms)第4版 练习 1.5.5

    对于quick-find,对每个输入数据对,其最少的循环次数为N(sites) 故对于109 sites和106 input pairs,其总的指令次数为:sum = 10^9 * 10^6 * 10 ...

  4. cookie对比localStorage哪个适合作为网站皮肤存储

    cookie对比localStorage哪个适合作为网站皮肤存储 cookie cookie : 一般由服务器生成,可设置失效时间.如果在浏览器生成,默认是关闭浏览器之后失效 存储大小:4k 每次都会 ...

  5. 常用连续型分布介绍及R语言实现

    常用连续型分布介绍及R语言实现 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数 ...

  6. C语言链表结构体(学习笔记)

    #include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...

  7. Bootstrap-other内置组件

    1.缩略图 缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底下(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件.并通过“thumbnail ...

  8. spring MVC--配置注解

    <context-param> 作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数 param-name 设定上下文的参数名称.必须是唯一名称 param-value 设定 ...

  9. alt+shift+j 自动添加类的文档注释 Myeclipse

    alt+shift+j  自动添加类的文档注释 Myeclipse ctrl+shift+y 将选中的内容大写换成小写 +x是转换成大写

  10. 关于字符,字节与base64编码的理解

    字符是用来显示的,如中文字符,英文字符,其类型我字符(串)类型: 字节是用来存储的,一个字节为8bit.由于字节是8位,无法对中文编码,因此诸如a=b'中文'的写法是错误的.但英文标点数字是可以的,如 ...