C++内存模型测试

来源:互联网 发布:软件开发兼职网 编辑:程序博客网 时间:2024/04/29 10:01

class Base1
{public:    Base1(int a):iBase(a){};    virtual ~Base1(void){}    int getIBase() const{ return iBase;}    static int instanceCount(){ return icount++;}    virtual void print()const{}private:    int iBase;    static int icount;};


下面是编译器的结果:



创建一个类所需要的空间为

私有数据+需表指针

所有类之间共享 

 静态变量 , 静态函数 成员函数,虚函数(_vptr指向的虚表)


下面是继承:

class DrivedB1:public Base1{public:    DrivedB1(int a):Base1(a),iDrived(a+5){};    virtual ~DrivedB1(void){}    //int getIBase() const{ return iDrived;}    static int instanceiDrivedCount(){ return iDrivedCount++;}    virtual void print()const{cout << "DrivedB1" << endl;}private:    int iDrived;    static int iDrivedCount;};int DrivedB1::iDrivedCount = 3;

Derived不是虚继承,所以是扩充已存在的虚函数表. print 函数被重写,新虚函数被添加到虚表后面.


Base1* p = &a;



多重继承

从单继承可以知道,派生类中只是扩充了基类的虚函数表。如果是多继承的话,又是如何扩充的?

1) 每个基类都有自己的虚表。

2) 子类的成员函数被放到了第一个基类的表中。

3) 内存布局中,其父类布局依次按声明顺序排列。

4) 每个基类的虚表中的print()函数都被overwrite成了子类的print ()。这样做就是为了解决不同的基类类型的指针指向同一个子类实例,而能够调用到实际的函数。



单虚继承 保留了基类的虚表

在虚继承中,派生类和基类的数据,是完全间隔的,先存放派生类自己的虚函数表和数据,中间以0x分界,最后保存基类的虚函数和数据。如果派生类重载了父类的虚函数,那么则将派生类内存中基类虚函数表的相应函数替换



普通多重继承


多重虚继承  上下两图对比一下就知道虚继承是怎么回事了.







0 0
原创粉丝点击