本文共 726 字,大约阅读时间需要 2 分钟。
1. 一般单一继承
只有一个虚表指针,虚表包含所有的虚函数
思考:1. 如果将GrandChild中的h_grandchild前面的virtual去掉,内存中的唯一变化是虚表缺少一项GrandChild::h_grandchild
2. 如果是child: virtual public parent?
output:
addr:0014FA44 sizeof = 28
0: f1783c = f110c8 GrandChild::g_child()//这个时候要注意,虚函数表里没有f//可以这样理解,虚函数表内的函数和非虚拟继承是一样的,但是基类的位置不一样 Child::h_child() GrandChild::h_grandchild() 1: f1784c = fffffffc fffffffc 10 2: 100 3: 1000 4: 0 5: f17828 = f11041 GrandChild::f() Parent::g() Parent::h() 6: 10虚基类肯定是放在最后,但是虚函数表中的内容就比较纠结,只放自己被重载的函数。
child和grandchild的指针地址相同,parent的指针地址在最后
2. 一般多继承
3. 虚基类的多继承
请参考:
附上本人检测内存分布的函数:
typedef void (*Fun)(void); GrandChild b; int *ptr; /*B b;*/ ptr = (int*)&b; cout <<"addr:" << ptr << " sizeof = " << sizeof(GrandChild) <
本文中的图片均来自:
转载地址:http://speti.baihongyu.com/