新人提問 派生類物件與組合類物件,,還有它們的記憶體分配問題

2022-05-08 02:14:58 字數 2232 閱讀 7244

1樓:篤俠

1:派生類建立物件後呼叫了基類的建構函式,不是建立派生類物件的同時也建立了基類的物件。而是建立派生類物件時呼叫基類的建構函式對派生類中所繼承自基類的部分初始化。

2:派生類物件在記憶體中包含基類的私有變數,只是不能直接訪問。

3:從**共享的角度看,組合類物件和派生類物件沒有什麼本質的不同,不同的是它們所表達的事物之間的邏輯關係:組合類物件一般表示「整體-部分」關係,而派生類物件一般表達「一般-具體」關係。

2樓:匿名使用者

1。建立派生類物件的同時也建立了基類的物件。假設基類物件的成員大小是4位元組,派生類本身增加的成員是8位元組的話,不考慮虛擬函式表指標所佔的空間,那麼派生類物件的成員要佔12位元組空間,其中前4位元組是繼承的基類成員,後8位元組是自己增加的成員。

2。基類的所有成員被派生類繼承後都變成派生類所擁有了,只是對於繼承而來的private成員沒辦法直接訪問而已,這樣設計保證了基類private成員的安全性。如果你希望基類的某些成員被派生類繼承且能訪問而又不允許外界普通使用者**訪問的話,將基類的那些成員宣告為protected就好了。

3。組合類物件中,它巢狀包含的類成員就和普通成員一樣,按照宣告的順序在記憶體中依次排列。而且,如果這個組合類物件是派生類的話,如我在1中所說,基類的成員還是會排在所有派生類自身成員的前面的。

3樓:

1.派生類建立物件後呼叫了基類的建構函式,不是意味著建立派生類物件的同時也建立了基類的物件,正確解釋是:派生類會繼承基類的public或者protected成員變數,派生類的建構函式除了要給自己新增的成員變數賦值之外,還要給從基類繼承來的成員變數賦值。

那麼給從基類繼承來的成員變數賦值就要呼叫基類的建構函式。例子如下:

class a

};class b:public a

};2.派生類不會繼承基類的私有變數,所以派生類的物件不包含基類的私有變數。

3.組合類是指一個類的成員變數是另外一個類的物件,舉例如下:

class a;

class b

;類b的物件含有類a物件的全部成員變數和函式。

而派生類物件只繼承基類的public和protected成員(含成員變數和成員函式),所以不含繼承基類的private部分。

兩者的差別在於基類的private部分。

c++ 自定義類物件記憶體分配問題?

4樓:匿名使用者

假設你沒有虛擬函式的話,32位下預設對齊模式一般的實現是最開始4個位元組給i,然後1個位元組給c,空3個位元組,8個位元組給d,後面pi和pc分別4個位元組。

5樓:匿名使用者

自動分配。你定義一個int,系統就自動給你分配4個位元組,你定義一個類物件,系統就會根據成員變數表自動分配。任何普通類的佔據空間大小都是確定的

6樓:匿名使用者

看 深入探索 c++ 物件模型

c# 基類引用變數引用派生類物件問題?

7樓:星辰緋櫻

變數所開闢的地址取決與使用new時的物件,例如new b()中,開闢的就是物件b的空間。

而a a = b;這樣的**,只是將物件首地址的指標又重新賦值給了變數a。(在這裡,你可能錯誤的理解的引用物件的宣告。引用型別的變數宣告只是一個4位元組的棧引用,這個引用標識著該引用地址的起始區間,也就是這個引用可以訪問到的記憶體地址區間。

)但因為b所引用的是物件b所開闢的空間,所以有這樣的偽**也是成立的:

a a = new b();

b b = (b)a;

這裡同理,a的引用一樣訪問不到子類b的name屬性。但是進行強轉後,b是可以訪問到b的name屬性的,因為這兩個變數a和b都是指向類b所開闢的記憶體空間。

引用變數**於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。在指令式語言中,引用變數通常是可變的;但在純函式式語言中,變數可能是不可變的。

⒈pt 是引用變數,申明引用變數時必須將其初始化.pt 和rate 的值指向相同的記憶體變數. 引用的最多用處就是作為函式的引數(結構和物件).

通過引用變數作引數可以是函式使用原始資料.而不是拷貝.

⒉引用的特點更接近於const 指標,一旦與某個變數關聯起來就將一直效忠於它,可以通過初始化來設定此時,rate的值和 pt的值都改為了30 但是地址還是原來rate的地址.而不是other的地址.

⒊如果程式不想改變傳遞給它的資訊,但是又想使用引用,那麼則應該使用常量引用

關於c派生類中虛擬函式的問題,C 已經在派生類中重定義了抽象類中的純虛擬函式,為什麼還不讓我用派生類定義物件!?

如果是虛擬函式的話,在派生類中重新定義其函式體時,不會導致同名覆蓋.當用基類指標指向派生類物件並呼叫虛擬函式時,執行的是在派生類中重新定義的虛擬函式的函式體.虛擬函式必須要在基類用virtual修飾才能為虛擬函式,派生類若重定義該函專數,則無論是否有屬virtual關鍵字都是虛擬函式。你要判斷派生類...

基類派生類的同名成員變數覆蓋問題

你的理解基本很對了。基類的那個print只能訪問基類的 a,訪問不到派生類的 a的。是這個意思,可以再看看虛擬函式的相關內容可能能理 回解更深刻一些。答 c 派生類成員覆蓋基類成員的問題 include using namespace std class a a a void a print cla...

C 的基類如何訪問其派生類的成員變數

直接訪問靜態變數肯定不行,但可以變通一下,通過虛擬函式獲得這個內靜態變數 給你個容例子,這樣是不是滿足你的要求?但這樣的話,每個繼承類都要做2件事 1.定義靜態變數 2.重寫虛擬函式,返回自己的靜態變數 這2件事可以通過巨集來做。mfc好象就是這麼幹的 include class a class b...