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; }
时间: 2024-10-11 05:04:26