派生類與基類之間的對象模型

先看一段代碼:
 
class CAnimal
{
public:
    CAnimal( )
    
{
        age 
= 1;
        num 
= 0;
    }

    CAnimal(
int ag, int nu)
    
{
        age 
= ag;
        num 
= nu;
    }

    
int age;
    
int num;
}
;
class CDog:public CAnimal
{
public:
    CDog( 
int age, int num, int kind ):
      CAnimal(age, num)
    
{
        
this->kind = kind ;
    }

    
int  kind;
}
;
int main( )
{
    
int a = 5;
    CAnimal an(
89);
    CDog dog(
123);

       
return 0;
}
派生類CDog公有繼承之CAnimal類,我們知道基類CAnimal有兩個數據成員:age 和 num ,派生類CDog有一個新增成員:kind ,因此派生類實際上擁有的數據成員是:age   num    kind 。
CAnimal類有 age 和 num ,CDog 類也有 age 和 num ,那麼CAnimal類和CDog類的這兩個數據成員之間是什麼關係呢?它們的內存地址一樣嗎?還是各有各地內存單元,互不影響?
就讓我們來看看,它們在內存單元上的真實面貌:
VC6.0下的一種情況:

0x0012FF64:
0x0012FF68:  01 00  00  00-----------------------對象 age 的起始地址,dog.age 的地址
0x0012FF6C: 02 00  00  00-----------------------dog.num 的地址
0x0012FF70: 03  00  00  00-----------------------dog.kind 的地址
0x0012FF74: 09  00  00  00-----------------------對象 an 的起始地址, an.age的地址
0x0012FF78: 08  00  00  00-----------------------an.num 的地址
0x0012FF7C:05  00  00  00------------------------變量 a 的地址
從上面的內存結構來看,CAnimal類和CDog類的兩個數據成員:age 和 num 在內存結構上是擁有獨立的地址單元的,互不影響!!
如果CAnimal類中有保護成員和私有成員變量,這種類型的變量也會被繼承到派生類中嗎?也就是說派生類對象的內存模型中會有從基類繼承來的保護成員和私有成員嗎?
實際上基類的所有成員(不管是不是私有的)都會被繼承到派生類中,只是這種情況下,派生類是無法訪問到這些私有變量的!!
CAnimal類的對象模型:
         an------------->  age
                                   num
CDog類的對象模型:
        dog-------------> age
                                    num
                                    kind


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章