15. 类的内存结构

一.无虚继承

1.单个类,无虚函数

按成员定义的顺序排列

B::member1

B::member2

 

2.单个类,有虚函数

虚表指针在偏移0

__vfptr

B::member1

B::member2

 

3.单继承,无虚函数

先父类,再子类

B::member1

B::member2

D::member1

D::member2

 

4.单继承,有虚函数

虚表指针在偏移0处,再父类,再子类

__vfptr

B::member1

B::member2

D::member1

D::member2

 

 

5.多继承,无虚函数

按继承列表的顺序,先所有父类,再子类

A::member1

A::member2

B::member1

B::member2

D::member1

D::member2

 

 

6.多继承,有虚函数

二.有虚继承

1.单虚继承,无虚函数

2.单虚继承,有虚函数

3.菱形继承,无虚函数

4.菱形继承,有虚函数

 

 

 

 

 

 

class D :public A, public B

D的内存

 

 

 

A的虚表

 

__vfptrA

---------

---------

-------->

&A::TestA

 

A::m_nA

 

B的虚表

 

&D::TestD

 

__vfptrB

-------->

&B::TestB

 

 

 

B::m_nB

 

 

 

 

 

D::m_nD

 

 

 

 

 

 

 

 

 

 

 

D新增的虚函数会挂靠在第一个虚表中。

D重写的虚函数会放在父类各自的虚表中。

如果A没有虚函数,则A没有虚表,有虚表的B会放在内存开始处。

A的虚表、B的虚表都是子类D的虚表

猜你喜欢

转载自www.cnblogs.com/Nutshelln/p/12945868.html