溫故而知新 C 中類的大小與其繼承關係

2021-09-23 01:31:21 字數 3824 閱讀 6546

1、空類:

#pragma once

class cnullclass

;

檢視cnullclass例項的大小:

int _tmain(int argc, _tchar* ar**)

輸出結果顯示,cnullclass例項的大小為1,即空類的例項只佔乙個位元組,且該位元組的內容並無實質意義。

2、只包含方法成員的類

#pragma once

class c******class

;#include "stdafx.h"

#include "******class.h"

c******class::c******class()

c******class::~c******class()

void c******class::memthod1()

#include "stdafx.h"

int _tmain(int argc, _tchar* ar**)

執行結果:

由此可知,乙個類的成員函式並不影響類的實際大小。

3、包含資料成員的類

class conememberclass

~conememberclass(){};

void foo();

void setdata2(int data2);

private:

int m_ndata;

int m_ndata2;

};void conememberclass::foo()

void conememberclass::setdata2(int data2)

int _tmain(int argc, _tchar* ar**)

執行結果:

記憶體結構如下:

可見,這種情況下,物件的儲存內容為資料成員的值,按照宣告中的順序。

4、簡單繼承類:

class csonclass :

public conememberclass

;csonclass::csonclass()

csonclass::~csonclass()

void csonclass::foo()

int _tmain(int argc, _tchar* ar**)

執行結果:

son class member - data : 3
記憶體結構為:

在記憶體中,首先存放的是基類的成員,然後是派生類的成員。如果派生類繼續向下派生,則其子類的資料繼續存放在後續位址中。

5、虛繼承的類:

#include "onememberclass.h"

class virtualinheritclass : virtual public conememberclass

;

執行結果:

記憶體結構:

可見,在虛繼承的情況下,類的最前面多了8個位元組的資料,這些位元組中儲存了乙個指標變數,指向乙個關於虛基類偏移量的陣列,偏移量是關於虛基類資料成員的偏移量。

另外對於某乙個類繼承自多個父類(b和c),這些父類又虛擬繼承自乙個共同的父類(a)的情況,記憶體結構如:(偏移量指標)(b的資料成員)(偏移量指標)(c的資料成員)(本物件的資料成員)(基類a的資料成員)。虛擬繼承利用虛基類偏移量表指標,使得即使某各類被重複繼承,基類的成員也只存在一次。

6、帶有虛函式的情況

第一種,乙個空類中宣告了乙個虛函式:

class cvirtualnull

;cvirtualnull::cvirtualnull()

cvirtualnull::~cvirtualnull()

void cvirtualnull::foo()

在這種情況下,cvirtualnull物件的大小為4,其內容只有乙個指標,指向該類的虛函式表。

第二種,某個子類繼承了乙個宣告了虛函式的父類:

在單繼承情況下,當子類自己定義了虛函式時,依然只有乙個虛函式表(繼承自父類),子類的虛函式指標將新增到這個虛函式表的後面。但當多繼承時,子類中可能包含多個虛函式表,分別對應每乙個父類。

第三種,包含虛函式類的虛繼承

class virtualinheritance;};

class sonclass1 : public virtual virtualinheritance;};

class sonclass2 : public virtual sonclass1

;};

在 visual studio中的輸出結果為:

對於virtualinheritance類,其包含乙個虛函式表+自身成員,大小為8。

對於sonclass1類,由於是虛擬繼承因此包含乙個虛函式偏移指標;由於自身存在虛函式,因此包含乙個指向虛函式表指標;隨後是自身的資料成員,最後是完整的父類物件。sonclass2情況與此類似。

總結:

1,普通單繼承,只需將自身成員變數的大小加上父類大小(父類中 有虛函式,子類中不管有沒有)若父類沒有虛函式,則子類大小需要加上指向虛表的指標大小。

2,普通多繼承,若幾個父類都有虛表,則子類與第乙個父類公用乙個虛表指標,其他有幾個有虛函式的父類則就有幾個虛表指標。

3,虛擬單繼承,此時若子類有虛函式則加上乙個自身的虛表指標的大小,(若沒有則不加)再加上自身的成員變數大小,還要加上乙個虛類指標ptr_sonclass_fatherclass,最後加上父類的大小。

4,多重虛擬繼承,此時若子類有虛函式則加上乙個自身的虛表指標的大小,(若沒有則不叫)再加上自身的成員變數大小,還要加上 乙個公用的虛類指標(不管有幾個虛擬父類,只加乙個),在加上所有父類的大小。

5、普通、虛擬混合多繼承,此時子類的大小為自身大小(若子類或普通父類有虛函式,則為成員變數+虛表指標大小;若都沒虛函式,則就為成員變數大小),加上乙個虛類指標大小,在加上虛擬父類的大小,在加上普通父類的大小(除虛表指標,因為它和子類公用乙個虛表指標)。

C 陣列 溫故而知新

using system using system.collections.generic using system.linq using system.text namespace 陣列 陣列初始化器只能在宣告陣列變數時使用,不能在宣告陣列之後使用 int iii new int 用花括號初始化陣...

C 溫故而知新,好吃

這一周,在業餘的時候,學習和 了c 中的知識點,一木不成林,一水難成海。1.net 是乙個開發平台,它幹著秦始皇的事,統一了程式設計類庫,提供了網路通訊標準可擴充套件標記語言的完全支援。方便你我他,大家使好它。microsoft.net 是microsoft xml web services平台。2...

溫故而知新 C語言 遞迴

遞迴。是的,差不多就是這種感覺。上面就是類似遞迴的顯示表現。2017 10 24更新 遞迴這個問題放了很久。也沒有寫。大概是自己還沒有好好理解吧。在這裡寫下自己理解的全部。一 何為遞迴。字面意義,分開看。有傳遞。有回歸。或者歸還。淺顯的理解就是呼叫自己。那麼遞迴可以呼叫自己,肯定是有一些約束的條件。...