参考: http://blog.csdn.net/wangyangkobe/article/details/5951248
下面的文章解释有错误,不要看。。。。。。。。。。
记住几句话:
编译器为每个有虚函数的类都建立一个虚函数表(其大小不计算在类中),并为这个类安插一个指向虚函数表的指针(大小计算在类中),即每个有虚函数的类其大小至少为一个指针的大小4
虚继承时编译器为该类安插一个指向父类的指针,指针大小为4
#include <iostream> #include <stdio.h> using namespace std; class A{};//1 class A2{}; class B:public A{};//1 class C:public virtual B{};//4 虚继承一个类 class D:public A,public A2{};//1 class E:public virtual A2,public C{};//8 虚继承一个类+C的size为4 class F:public virtual A2,public C{virtual ~F();};//12 虚继承一个类+C的size为4+一个虚函数指针 class G:public virtual A2,public F{virtual ~G();};//12 虚继承一个类+C的size为4+一个虚函数指针 int main(){ cout<<"sizeof(A)="<<sizeof(A)<<endl; cout<<"sizeof(B)="<<sizeof(B)<<endl; cout<<"sizeof(C)="<<sizeof(C)<<endl; cout<<"sizeof(D)="<<sizeof(D)<<endl; cout<<"sizeof(E)="<<sizeof(E)<<endl; cout<<"sizeof(F)="<<sizeof(F)<<endl; cout<<"sizeof(G)="<<sizeof(G)<<endl; }
下面代码:
#include <iostream> #include <stdio.h> using namespace std; class A{ virtual void fun(){} virtual void fun2(){} };//4 一个虚函数指针 class A2{}; class B:public A{};//4 指向父类虚表的指针 class C:public virtual B{};//8 虚继承指针+指向父类虚表的指针 class D:public A,public A2{};//4 指向父类虚表的指针 class E:public virtual A2,public C{};// 虚继承指针+指向父类虚表的指针 class F:public virtual A2,public C{virtual ~F();};//12 一个虚继承指针+指向父类虚表的指针+指向本类虚表的指针 class G:public virtual A2,public F{virtual ~G();};//12 一个虚继承指针+指向父类虚表的指针+指向本类虚表的指针 int main(){ cout<<"sizeof(A)="<<sizeof(A)<<endl; cout<<"sizeof(B)="<<sizeof(B)<<endl; cout<<"sizeof(C)="<<sizeof(C)<<endl; cout<<"sizeof(D)="<<sizeof(D)<<endl; cout<<"sizeof(E)="<<sizeof(E)<<endl; cout<<"sizeof(F)="<<sizeof(F)<<endl; cout<<"sizeof(G)="<<sizeof(G)<<endl; }