C 繼承裡的 就近原則

2022-03-17 20:27:55 字數 2225 閱讀 9233

參考部落格:

用三個類來描述c#繼承中的就近原則:animal類,bird類,chicken類

1.類關係

類之間的關係如下:

public

abstract

class

animal

}public

class

bird : animal

", type);

}private

string

color;

public

string

color

set }}

public

class

chicken : bird

", type);

}public

void

showcolor()

", color);}}

2.測試

執行如下**的輸出結果會是什麼?

static

void main(string

args)

3.結果

輸出結果是

4.原因分析

首先介紹兩個c#中物件的原則

○ 關注物件原則:bird bird=new chicken(); 我們關注的應該是new的是什麼類,也就是關注建立的是chicken型別的物件;

○ 執行就近原則:首先訪問離它建立最近的字段或者方法;

4.1 根據記憶體分布原則,在bird bird=new chicken();時,棧上儲存的是bird型別的變數引用,而託管堆上的是chicken型別的物件,記憶體分布圖應該是這樣子的。

此時託管堆上字段有兩個,分別是bird_type、chicken_type(注意:編譯器不會重新命名,此處為了便於理解),那應該輸出哪個才對?根據執行就近原則,bird.type 其中的bird是bird型別的變數引用,所以,首先會訪問 bird_type="birdtype";

也就是說,在建立bird這個物件的時候,它第一時間找到的type欄位是bird類中的字段,即birdtype,所以不管最終new的物件是bird類的物件還是其子類的物件,bird.type輸出的內容都是birdtype,這個就是符合執行就近原則。

4.2 由於bird類中的showtype()方法已經在chicken類中被重寫了,所以在記憶體分布圖中的方法表上,只能找到chicken.showtype();而在chicken類中, private string type = "chicken"; type欄位被賦值,所以輸出結果為「this type is chickentype」。

5.拓展

5.1物件的建立過程

物件的建立過程是按照順序完成了對整個父類及其本身欄位的記憶體建立,並且欄位的儲存順序是按照類的高低層次來的,最高層的類排在最前面,如果父類和子類出現了同名字段,則子類建立的時候,編譯器會自動加與區別這是兩個不同的字段,比如:type欄位,bird_type、chicken_type 這樣子,到了這一步,用示例圖來表示是這樣子的:

5.1方法表

方法表的建立跟字段的建立過程類似,也是逐層遞迴知道object類,chicken子類生成方法列表時,先將bird類所有虛方法複製乙份,如果chicken類有override父類的虛方法,則子類方法覆蓋相應的虛方法,同時新增子類新方法,並且順序也是父類在前,子類在後,這個順序很重要,在後面一節方法呼叫的時候,就會跟這個順序有關,也是很多面試題的考點。

總結:方法表 = 父類沒有被override的方法 + 子類子類的方法,所以到了這一步,用示例圖來表示應該是這樣:

6.總結

我們可以理解繼承的本質,無論把bird.type設定為public還是private,父類的字段都早就已經存在子類物件所在託管堆的記憶體分配空間中了,只是設定為private的時候,子類物件無法訪問而已。

部落格****於

變數的就近原則

就近原則 principle of proximity 把相關的操作放在一起,例如讓注釋靠近它所描述的 讓控制迴圈的 靠近迴圈本身等。變數的就近原則指盡可能在靠近第一次使用變數的位置宣告和定義該變數。就近原則實際上也是變數的作用域最小化的一種實現手段。過早地聲 明區域性變數不僅會使它的作用域過早地擴...

c 基礎 繼承 11 黎克特制替換原則

c 中只能單繼承。概念 父類容器裝子類物件 作用 方便對子類物件的管理 使用 1.is 判斷乙個物件是否是指定類物件,是返回true,不是返回false 2.as 將乙個物件轉化為指定類物件 例子 class gameobject class animal gameobject class tree...

就近原則 const關鍵字的使用

在c中,const關鍵字的用途就是使函式操作時不改變其修飾的變數的值。平常我們見得多的const用法有如下幾種,似乎可以總結為 就近原則 即const最靠近其右邊哪個變數,就說明那個變數為常量。c語言中const用法 在linux0.11中讀到skip atoi 函式 如下 static int s...