首先:
#include <iostream> using namespace std; class A { public: void foo(){} }; class B:public A { public: void foo(){} }; class C:public A { public: void foo(){} }; class D: public B,public C { public: void foo(){} }; int main(int argc, char *argv[]) { A a; B b; C c; D d; cout<<"A 的大小为: "<<sizeof(A)<<endl; cout<<"B 的大小为: "<<sizeof(B)<<endl; cout<<"C 的大小为: "<<sizeof(C)<<endl; cout<<"D 的大小为: "<<sizeof(D)<<endl; return 0; } /* output A 的大小为: 1 B 的大小为: 1 C 的大小为: 1 D 的大小为: 1 */
然后是有虚函数的
#include <iostream> using namespace std; class A { public: virtual void foo(){} }; class B:public A { public: void foo(){} }; class C:public A { public: void foo(){} }; class D: public B,public C { public: void foo(){} }; int main(int argc, char *argv[]) { A a; B b; C c; D d; cout<<"A 的大小为: "<<sizeof(A)<<endl; cout<<"B 的大小为: "<<sizeof(B)<<endl; cout<<"C 的大小为: "<<sizeof(C)<<endl; cout<<"D 的大小为: "<<sizeof(D)<<endl; return 0; } /* output A 的大小为: 4 B 的大小为: 4 C 的大小为: 4 D 的大小为: 8 */
由于A中foo为虚函数,因此A对象内有一个指向虚函数表的指针,即A对象大小为4。B和C均为单继承,所以也只有一个虚函数指针,也为4字节。D有继承自两个类,且两个类均有虚函数,故有两个虚函数表指针,所以为8字节。
再者,看看虚继承的情况
#include <iostream> using namespace std; class A { public: void foo(){} }; class B:virtual public A { public: void foo(){} }; class C:virtual public A { public: void foo(){} }; class D: public B,public C { public: void foo(){} }; int main(int argc, char *argv[]) { A a; B b; C c; D d; cout<<"A 的大小为: "<<sizeof(A)<<endl; cout<<"B 的大小为: "<<sizeof(B)<<endl; cout<<"C 的大小为: "<<sizeof(C)<<endl; cout<<"D 的大小为: "<<sizeof(D)<<endl; return 0; } /* output A 的大小为: 1 B 的大小为: 4 C 的大小为: 4 D 的大小为: 8 */
对虚继承的结果表示不理解,听说《深度探索C++对象模型》有介绍,要抽个时间看一看。
以上试验均在VS2008环境下编译运行。