Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3518402
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2010-09-25 10:15:05

类的内存布局-sizeof(类对象)

一、简单对象
#include
class A
{
public:
int a;
char b;
static int c;
virtual ~A(){};
};

int A::c=123;

int main()
{
A asimple;
cout<return 0;
} //result=4+4+1+3=12即字节对齐(虚指针+非静态数据成员)

二、单继承

#include
class A
{
public:
int a;
char b;
static int c;
virtual ~A(){};
};

int A::c=123;

class B:public A
{
public:
int d;
virtual void foob(){};
};

int main()
{
// A asimple;
B bsimple;
cout<return 0;
} //result=(4+4+1+3)+4=16即字节对齐(基类size+B自己的非静态数据成员)

三、多继承

#include
class A
{
public:
int a;
char b;
static int c;
virtual ~A(){};
};

int A::c=123;

class B
{
public:
int d;
virtual void foob(){};
};
class C:public A,public B
{
public:
int e;
};


int main()
{
A asimple;
B bsimple;
        C csimple;
cout<//12
cout<//8
cout<       //12+8+4=24 即字节对齐(基类A大小+基类B大小+C自己的非静态数据成员)
return 0;
}

四、菱形继承
1.非虚拟继承方式

#include
class A
{
public:
int a;
char b;
static int c;
virtual ~A(){};
virtual void fooa(){};
};

int A::c=123;

class B:public A
{
public:
int d;
virtual void foob(){};
};
class C:public A
{
public:
int e;
};

class D:public B,public C
{
public:
char f;
};


int main()
{
A asimple;
B bsimple;
    C csimple;
D dsimple;
cout<12
cout<16
cout<16
cout<16+16+4=36 同多继承方式
return 0;
}
2.虚拟继承
(1)B中重写fooa(),但不定义新的虚函数
#include
class A
{
public:
int a;
char b;
static int c;
virtual ~A(){};
virtual void fooa(){};
};

int A::c=123;

class B:virtual public A
{
public:
int d;
// virtual void foob(){};
virtual void fooa(){cout<<"fooa in B"<};
class C:virtual public A
{
public:
int e;
};

class D:public B,public C
{
public:
char f;
};


int main()
{
A asimple;
B bsimple;
        C csimple;
D dsimple;
cout<cout<20
cout<20
cout<32
return 0;
}

(2)B定义新的虚函数
#include
class A
{
public:
int a;
char b;
static int c;
virtual ~A(){};
virtual void fooa(){};
};

int A::c=123;

class B:virtual public A
{
public:
int d;
virtual void foob(){cout<<"foob in B"<// virtual void fooa(){cout<<"fooa in B"<};
class C:virtual public A
{
public:
int e;
};

class D:public B,public C
{
public:
char f;
};


int main()
{
A asimple;
B bsimple;
    C csimple;
D dsimple;
cout<12
cout<24
cout<20
cout<36
return 0;
}

综合1,2,可见
1.非虚拟继承时,无论派生类是否定义新的虚函数,基类和派生类总是共享一个虚函数表,不需要另加指向虚函数的指针。
2.虚拟继承时,若是派生类只是继承或重写基类中虚函数,则基类和派生类是共享一个虚函数表;若派生类新定义了虚函数,则需要新加一个虚指针指向新的虚函数表。

阅读(767) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~