测试环境 visual express 2013
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
class hollow //size 1,为了在内存中给其对象分配一个独一无二的地址,编译器自动给其增加一个char成员变量
{};
class A //size 4,编译器给其增加一个vptr变量,指向虚函数表vtbl
{
public:
virtual void print(){ cout << "A" << endl; }
};
class B :public A //size 4,
{
};
class C :public A //size 4,只是为了证明类只维护一个vptr,而不会继承子类的vptr,这句话只在使用简单继承时成立
//多重继承的时候,派生类有和子类个数相同的vptr
{
virtual void print(){ cout << "C" << endl; }
};
//虚继承
class C1 //size 4
{
int a;
};
class V1 :virtual public C1{}; //size 8 //一个C1大小和一个vbptr指针的宽度,vbptr指向一个表格,表格内存储的是虚基类距离和派生类的相对地址偏移
class V2 :virtual public C1{}; //size 8 //同上
class V3 :public V1, public V2{};//size 12 //一个V1大小+V2大小-C1,因为派生类中只保存一份虚基类的实体
//虚继承
class VC1 //size 8一个int 大小和一个vptr指针大小
{
int a;
virtual void print();
};
class VV1 :virtual public VC1{ virtual void print(); }; //size 12 一个VC1大小+一个vbptr指针宽度
class VV2 :virtual public VC1{ virtual void print(); }; //同上
class VV3 :public VV1, public VV2{ virtual void print(); };//VV1+VV2-VC1,需要注意的是VV1,VV2各含有一个vptr
class Base
{
public:
int a;
int b;
};
void offset_test()
{
int Base::* offsetA = &Base::a;
int Base::* offsetB = &Base::b;
}
int _tmain(int argc, _TCHAR* argv[])
{
V1 c1;
printf("%d", &Base::b);
cout << "size of C1 is " << sizeof(C1) << endl;
cout << "size of V1 is " << sizeof(V1) << endl;
cout << "size of V2 is " << sizeof(V2) << endl;
cout << "size of V3 is " << sizeof(V3) << endl;
cout << "size of VC1 is " << sizeof(VC1) << endl;
cout << "size of VV1 is " << sizeof(VV1) << endl;
cout << "size of VV2 is " << sizeof(VV2) << endl;
cout << "size of VV3 is " << sizeof(VV3) << endl;
cout << sizeof(hollow) << endl;
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
return 0;
}