虚拟继承内存调试(VC6.0)

类继承情况如下图:

虚拟继承内存调试(VC6.0)_第1张图片

代码如下:

class A
{
	virtual aa(){};
	int a;
};

class B : public virtual  A
{
	char j[3];//加入一个变量是为了看清楚class中的vfptr放在什么位置
public:
	virtual bb(){};
};
class C : public virtual A
{
	char i[3];
public:
	virtual cc(){};
};
class D:public B,public C
{
public:
	virtual void dd(){};
protected:
private:
	int val;
};
#include <iostream>
using namespace std;
int main()
{
	A aa;
	int a = sizeof(aa);
	B bb;
	int b = sizeof(bb);
	C cc;
	int c = sizeof(cc);
	D dd;
	int d = sizeof(dd);
	printf("a= %d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
	return 0;
}

内存布局图如下:

虚拟继承内存调试(VC6.0)_第2张图片

单步调试图如下:

虚拟继承内存调试(VC6.0)_第3张图片

图一 刚刚main函数过后的内存栈

虚拟继承内存调试(VC6.0)_第4张图片


虚拟继承内存调试(VC6.0)_第5张图片

  图二 刚刚main函数过后的虚函数表

虚拟继承内存调试(VC6.0)_第6张图片

  图三 单层虚拟多继承刚到aa时的内存栈图

虚拟继承内存调试(VC6.0)_第7张图片

   图四 单层虚拟多继承aa运行之后的内存栈图

虚拟继承内存调试(VC6.0)_第8张图片

图五 单层虚拟多继承刚到bb时的内存栈图

虚拟继承内存调试(VC6.0)_第9张图片

图六  单层虚拟多继承bb运行之后的内存栈图

虚拟继承内存调试(VC6.0)_第10张图片

图七 单层虚拟多继承刚到cc时的内存栈图

虚拟继承内存调试(VC6.0)_第11张图片

图八  单层虚拟多继承cc运行之后的内存栈图

虚拟继承内存调试(VC6.0)_第12张图片

图九 单层虚拟多继承刚到dd时的内存栈图

虚拟继承内存调试(VC6.0)_第13张图片

图十  单层虚拟多继承dd运行之后的内存栈图

刚到main函数过后的时候虚函数表就存在了,所以就不用上传了。

图十一 虚函数表

你可能感兴趣的:(C++,继承,内存,调试,VC)