C 特性探尋 繼承 成員函式 this指標

2021-04-01 16:56:48 字數 1099 閱讀 4265

繼承和物件淨增長

c++中類的繼承,是具有淨增長效果的。如果基類是base,繼承類是derived,那麼建立

乙個derived類的例項b,在位址空間上,b的前面部分,剛好可以視為另乙個base的例項

(a),後面才是繼承所帶來的擴充套件資料部分。所以繼承具有淨增長或者說淨擴充套件效果。

c++的繼承絕不會破壞基類的資料結構,這可以肯定是乙個基本原則。因為如此,所以c+

+物件可以安全下塑造型(downcast):可以作為基類物件來看待和操作,而不會有任何

不妥。另外,由於c++採用虛函式實現了多型性,就有了與類關聯的虛函式表。我們可以看到,

繼承類的虛函式表對於基類的來說也是淨增長的。

成員函式和this指標

類的成員函式和乙個普通的(全域性)函式可以認為沒有什麼差別。對於編譯器來說,經

過名稱處理後(例如:在函式名稱前面加上命名空間、類名),乙個成員函式其實就是

乙個普通函式,在編譯後的**區域有著確定的函式體和函式入口。最大的差異發生在

呼叫時,對於成員函式,編譯器將隱含push this指標,this指標指向物件的位址(物件

可能位於棧上或堆上或全域性資料區),這就是操作所需要的資料(即成員資料)所在。

…push p2

push p1

push object_pointer  ; for c++ programmer, it is called 「this」 pointer

call f

…將資料和對於資料的操作捆在一起,正是物件導向語言中的封裝思想,成員函式的需要

訪問成員資料,通過傳遞this指標,這完美地實現了。

對於靜態成員函式,實際上就是普通函式而已,只不過編譯器限制了它的名字可視範圍

(掛在某個類下)。呼叫靜態成員函式,是不需要push this指標的。呼叫某個類的靜態

函式,只要在函式名字前加上類名限定符即可,而不需要乙個物件指標。乙個常見的誤

用就是在靜態成員函式中試圖訪問普通成員變數(沒有物件指標,如何訪問其成員變數

?)。不過靜態成員函式能訪問靜態成員變數。類似地,靜態成員變數實際上就是一種

有訪問限制的全域性變數而已。從類的外部訪問靜態成員變數,前面需要加上類名限定符

C 特性探尋 建構函式和析構函式

建構函式提供了一種機制,通過它有機會完成必要的初始化工作,從而使物件成為有意義 的存在物,而不僅僅只是一塊原始的空間。但是,我們逐漸了解到,建構函式具有的地位,不僅對於使用者 程式設計師 對於編譯器履 行職責也極為重要。通過這個機制,它讓c 的一些基本的特性,如繼承 多型得到了正確 的貫徹和表現。首...

C 特性 繼承

學習c 有一段時間了,今天就來總結一下c 的第二個特性 繼承。首先介紹一下繼承的概念,所謂的繼承就是用已有的類 基類 根據實際需要定義新的類 派生類 的過程,其實質是 復用。繼承關係如下圖所示 當然,派生類的資料並不是全部來自於基類,也可以根據需要在派生類中新增額外的成員變數和成員方法。繼承的語法結...

47 C 繼承中的靜態成員特性

靜態成員函式和非靜態成員函式的共同點 他們都可以被繼承到派生類中。如果重新定義乙個靜態成員函式,所有在基類中的其他過載函式會被隱藏。如果我們改變基類中乙個函式的特徵,所有使用該函式名的基類版本都會被隱藏。靜態成員函式不能是虛函式 virtual function class base static ...