一.无虚继承
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的虚表 |