class A
{
};
class B
{
char ch;
virtual void func0() { }
};
class C
{
char ch1;
char ch2;
virtual void func() { }
virtual void func1() { }
};
class D : public A, public C
{
int d;
virtual void func() { }
virtual void func1() { }
};
class E : public B, public C
{
public:
int e;
virtual void func0() { }
virtual void func1() { }
//子类里(E)没有实现func(),所以在E的子类里B的vfptr指向C的func()和E的func1()
virtual void func123() { }
}
int main()
{
//result=1,空类,大小为1
cout << "A=" << sizeof(A) << endl;
//result=8,4(vfptr,4)+4(char ch,内存对齐,4) = 8
cout << "B=" << sizeof(B) << endl;
//result=8 , 4(vfptr,4)+4(char ch1,char ch2,内存对齐,4) = 8
cout << "C=" << sizeof(C) << endl;
//result=12, 4(类D的vfptr,4)+4(存在基类的char ch1,char ch2,内存对齐,4)+4(int d) = 12
D obj_d; //首先VPTR指向的虚函数表中保存的是类D中的两个虚函数的地址
cout << "D=" << sizeof(obj_d) << endl;
//result=20,(多继承)继承多少个有虚函数的类,就有多少个虚函数指针,也即这几个虚函数指针组成了自己的vfptr(编译器不再单独给自己的虚函数插vfptr)
//4(B的vfptr)+4(char ch)+4(C的vfptr)+4(C中 char ch1,char ch2)+4(E 中int d) = 20
//这个可以从调试下看出来
E obj_e;
obj_e.e = 123;
cout << "E=" << sizeof(obj_e) << endl;
return 0;
}
转载于:https://my.oschina.net/Yuqingmu/blog/468947