题目:在64位电脑上,求sizseof(A),sizseof(B),sizseof(C);
代码:
#include<iostream>
using namespace std;
class A
{
char a[2];
public:
virtual void aa() {};
};
class B : public virtual A
{
char b[2];
char a[2];
public:
virtual void bb() {};
virtual void aa() {};
};
class C : public virtual B
{
char a[2];
char b[2];
char c[2];
public:
virtual void cc() {};
virtual void aa() {};
virtual void bb() {};
};
int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
system("pause");
return 0;
}
如何用vs查看类内存分配:
点击属性,
C/C++下的命令行,添加' /d1 reportAllClassLayout '语句 ,再次编译就能查看。
存在虚函数,则存在vfptr;
存在虚继承,则存在vbptr;vfptr在vbptr之前。
普通继承,先基类元素后继承类元素
虚基类元素排在最后(这个是和 先基类后继承 不同之处)
在VC++中,对每个继承自虚基类的类实例,将增加一个隐藏的“虚基类表指针”(vbptr)成员变量,从而达到间接计算虚基类位置的目的。该变量指向一个全类共享的偏移量表,表中项目记录了对于该类而言,“虚基类表指针”与虚基类之间的偏移量。