關於空類的繼承的問題

2022-01-19 07:37:42 字數 584 閱讀 1622

前段時間想到乙個關於空類的問題,示例**如下:

class

base

;class derived: public

base

;

sizeof(derived)在gcc 4.8.4編譯器下輸出的是8。乙個空物件為什麼會占用這麼大的記憶體空間?

下面我們來討論下這個問題。

首先是語言本身造成的額外負擔。c++的多型是通過虛函式表實現的。因此會在物件中插入乙個指向虛函式表的指標,所以這個指標佔了4位元組的空間。

其次編譯器對於特殊情況所提供的優化處理。base物件雖然是空物件,但為了標識這個空物件和其他空物件的區別,所以需要1 byte來作為區分 。因為c++標準保證「出現在子類中的基類子物件要保持其原樣完整性」,所以base物件的1 byte也出現在derived物件中。

最後對齊處理。雖然基類的1 byte加上子類的4 bytes是5 bytes的空間,但為了更有效的訪問記憶體資料,會對基類的1位元組進行對齊就是填補3 bytes,所以最終的結果是8 bytes。

當然這個大小和機器有關,也和編譯器也有關。比如visual studio 2015 輸出的是4 bytes。

關於繼承的問題

繼承,我這裡只說方法,繼承關心的是我從父類繼承來的東西有不是擁有的東西 簡單地說也就是能使用的東西 1。訪問修飾符為private的方法不能被繼承,而是被隱藏,在子類中可以寫乙個跟父類訪問修飾符為private方法一樣的方法,這裡不存在覆蓋問題,因為方法被隱藏,根本就沒有被繼承,所以不存在覆蓋問題,...

關於繼承的問題

摘自rocky ren 派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。派生類只能有乙個直接基類,所以c 並不支援多重繼承,但乙個基類可以有多個直接派生類。繼承是可以傳遞的。即 如果 classb 派生出 classc classa 派生出 classb 則 classc 會繼承 class...

關於類繼承

size medium 1關於繼承 繼承可以反映事物之間的聯絡 可以減少 量 用 color blue extends color 關鍵字 例如 color blue public void unstudent extends student color 繼承了父類中的公共屬性和公共方法 2.自動轉...