一.背景
之前一直對類內存分布和對象真正的內存分布沒有清楚的理解.看到類內存分布時,子類中的變量有一部分是來自父類的,就認為在生成父類對象和子類對象時,他們共有的變量在內存上是重疊的.后來想了一下,應該不是這么回事,就實地考察了下.
二.舉例驗證
有如下的繼承關系,有分別定義了對應的對象,考察不同對象的內存情況.
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沒有一點關系(注意區分子類的父類部分和別的父類對象),他們是相互獨立的三個對象.它們存儲的虛表指針的內容也是不同的.