• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
inu1255
博客园    首页    新随笔    联系   管理    订阅  订阅

C++ 从内存的角度,学习虚继承机制

测试代码


#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'

自己尝试,留个记录

posted @ 2015-06-29 01:28  inu1255  阅读(184)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3