關於類的繼承的乙個例子

2022-02-26 19:43:09 字數 2015 閱讀 2458

學習物件導向,繼承是乙個不得不說的問題。從c++開始,我們就學習繼承和介面。呵呵,昨天收到一間叫網龍公司的面試email,先發個試題來做的email面試還是第一次見識。可能偶面試經驗少吧(不超過十次),面試題目裡面有乙個問題很適合用來作為繼承的講解例子。

因為這個例子實在太美妙了,忍不住做了一下,並試著分析了。問題如下:

問下面**的輸出結果:

public

class

apublic

void

print2(a a)

}public

class

b : a

}public

static

void

main()

實際輸出結果是2、5、1、6、1、5、2、6

我們來分析一下:

在**中a.print2(b),輸出結果是2、5。因為a.print2(b)實際上引數是a a = new b()形式初始化的,所以執行a.print1(1)的時候實際是執行b類的print1,因為用b類初始化,而b類重寫了print1嘛。所以就是實際是b.print1(i),也就是執行base.print(i+1),所以結果是2。當執行print1(5)的時候,這時候與引數無關,只與a.print2(b)中的a.有關,即是顯式執行a.print1(5),當然輸出結果就是5了。

在b.print2(a)中,輸出結果是1、6。因為b.print1(a)實際上引數初始化是a a =  new a(),因為b中根本沒有print2函式,所以執行父類a中的print2函式。print2函式中a.print1(1),因為用a宣告而且用a初始化,所以執行a.print1(1),顯式執行父類print1,所以結果是1。當執行print1(5)的時候,與初始化的引數無關,只與b.print2(a)中的b.有關,即是執行b.print1(5),因為b.print1是重寫過的,所以執行結果是6。

在a.print2(a)中輸出1,5。 引數初始化a a = new a() 所以執行a.print1(1),a.print1(5)。這個比較簡單。

在b.print2(b)中輸出2,6。 引數初始化a a = new b() 所以執行b.print1(1),b.print1(5)。這個也正路,沒有特別的地方。

1、object類是所有類的基類。

2、建構函式和析構函式不能被繼承,但會被子類初始化的時候呼叫。

3、子類繼承父類除建構函式和析構函式以外的一切成員,不論父類對它們定義了什麼樣的訪問方式,都能被繼承,訪問方式只能限定子類是否能訪問它們。

4、子類可以通過定義和父類同名的成員來覆蓋父類成員,但是並沒有刪除父類的成員,只是遮蔽了不能訪問。

5、可以通過定義虛方法,虛屬性,虛索引等來讓子類過載達到多型的目的。

6、c#中的類只能單重繼承,不能實現多重繼承。但是介面可以多重繼承。

7、類的宣告和初始化就像乙個模具和用料的關係,宣告是模具,初始化是將材料放入模具使之成形。例如父類a定義乙個虛方法function1(),乙個方法function2(),子類b繼承父類a,並覆寫function1()和重寫function2(),如下宣告初始化:

a a 

=new

b();

因為是用父類a宣告,用子類b初始化,所以當呼叫a.function1()的時候,呼叫的是子類覆寫的function1(),但當用a.function2()的時候,因為子類只重寫了function2而不是覆寫,而類的宣告是用父類a宣告的,就像已經使用了a的模具,但是用的料是模具b的料。無論料是什麼,出來的形狀始終是a的形狀,所以,a.function2()會呼叫父類的function2()方法。(a類的function1()宣告是虛方法,就是說該模具的function1()部分是可以改變的,可以當子類初始化的時候可以看成是子類b改變了a模具的function1()的形狀,所以a.function1()出來的是b的形狀,就是呼叫b的function1()方法。)。這個比喻有點勉強,但是能說明類繼承之間的關係。

8、在宣告類和初始化中,不能用子類宣告但用父類初始化(好像這個是當然的,汗~)也就是說,「=」號右邊的類總是左邊的派生類(當然自身也ok)。

9、還沒有想到,想到再寫~~呵呵!

關於陣列的乙個例子

慶祝活動,現在a b c三條 要同時開始鳴放禮炮各21響。已知a艦每隔5秒鳴放一次,b艦每隔6秒鳴放一次,c艦每隔7秒鳴放一次。假設炮手對時間掌握的都很準,那麼總共聽到多少聲炮響?對於這個問題,可以使用陣列來解決。首先使用三個陣列分別存放a,b,c艦21響禮炮的鳴放時間點,這裡可以使用乙個for迴圈...

LineDDA的乙個例子

unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,extctrls,stdctrls,buttons type tfmmain class tform ...

SQL GROUP CONCAT的乙個例子

我有乙個這樣的資料庫 user info 現在有乙個需求是把這樣 9 條記錄按照 username 來 group 成3條記錄 目標 shu female 201 lee male 202 yuki female 181 如果用select from user info group by usern...