分清楚父類對象和子類對象的內存分配


一.背景

之前一直對類內存分布和對象真正的內存分布沒有清楚的理解.看到類內存分布時,子類中的變量有一部分是來自父類的,就認為在生成父類對象和子類對象時,他們共有的變量在內存上是重疊的.后來想了一下,應該不是這么回事,就實地考察了下.

二.舉例驗證

有如下的繼承關系,有分別定義了對應的對象,考察不同對象的內存情況.

class Base
{
public:
    int a;
    int b;
public:
    void BaseFunc()
    {
    }
    virtual void VirFunc()
    {

    }
};

class Derive1 : public Base
{
public:
    int c;
public:
    virtual void VirFunc()
    {

    }
};

class Derive2 : public Base
{
public:
    int d;
public:
    virtual void VirFunc()
    {

    }
};

 

int main()
{
    //打印下父類和子類對象的內存是否共用.
    Base b;
    Derive1 d1;
    Derive2 d2;
    
    cout << "父類對象的地址" << &(b) << endl;
    cout << "子類1對象的地址" << &(d1) << endl;
    cout << "子類2對象的地址" << &(d2) << endl;

   cout << "父類對象虛表指針的地址" << *((int *)&b) << endl;
     cout << "子類1對象虛表指針的地址" << *((int *)&d1) << endl;
   cout << "子類2對象虛表指針的地址" << *((int *)&d2) << endl;

    cout << "父類對象中a的地址" << &(b.a) << endl;
    cout << "子類1對象中a的地址" << &(d1.a) << endl;
    cout << "子類2對象中a的地址" << &(d2.a) << endl;

    cout << "子類1對象中c的地址" << &(d1.c) << endl;
    cout << "子類2對象中d的地址" << &(d2.d) << endl;

    return 0;
}

得到如下的內存分布情況,這三個對象的內存是相互獨立的,並非想象中會共用內存.

注意這三個對象並不存在繼承關系,d1和d2的父類部分和b沒有一點關系(注意區分子類的父類部分和別的父類對象),他們是相互獨立的三個對象.它們存儲的虛表指針的內容也是不同的.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM