為什麼抽象類中的建構函式可以被繼承並被呼叫?

2022-06-16 11:12:14 字數 947 閱讀 6391

namespace

public a()

}public

class

b : a

public b()

}public

class

program

}}

輸出:static b

static a

normal a

normal b

抽象類a中的建構函式 public a() 被呼叫了,建構函式應該是用來例項化物件的吧,而抽象類是不能被例項化的,這是不是矛盾啊?請大神指點

很容易理解,抽象類是需要被其他類繼承的,這些子類是需要例項化的,例項化子類的時候是需要呼叫子類的建構函式的,而在預設情況下,在呼叫子類的建構函式前是先要呼叫基類的建構函式的,這一點和非抽象的類一樣.因為你例項化的不是抽象類而是抽象類的子類,這個並不矛盾

你好,在你的回答中,我看到這麼一句話,【而在預設情況下,在呼叫子類的建構函式前是先要呼叫基類的建構函式的】,那麼為什麼程式是先輸出static b, 再輸出 static a   normal a, 也就是為什麼先呼叫了子類的靜態建構函式,再呼叫父類的靜態建構函式,根據我對你那句話理解,不應該是先呼叫父類的,再呼叫子類的嗎??

這個問題問的好 那麼我們看看靜態建構函式的特點(來自msdn)

靜態建構函式既沒有訪問修飾符,也沒有引數。

在建立第乙個例項或引用任何靜態成員之前,將自動呼叫靜態建構函式來初始化類。

無法直接呼叫靜態建構函式。

在程式中,使用者無法控制何時執行靜態建構函式。

也就是說 :靜態建構函式是在建立第乙個類例項前由系統呼叫的 所以你會看出來靜態構造是為了初始化類的靜態屬性起作用的。那麼類的靜態屬性有什麼特點呢?那就是不能被繼承,因此可以很容易推斷出來,靜態構造肯定會先初始化子類的資訊 也會先呼叫。這點要跟建構函式區別開來

from:

抽象類可以有建構函式嗎

我們知道,抽象類是不能被例項化的。但抽象類是否可以有建構函式?答案是可以有。抽象類的建構函式用來初始化抽象類的一些字段,而這一切都在抽象類的派生類例項化之前發生。不僅如此,抽線類的建構函式還有一種巧妙應用 就是在其內部實現子類必須執行的 以下就是在抽象類的建構函式中來初始化字段。class prog...

抽象類的建構函式

1 抽象類是可以有建構函式的。但很多人認為,建構函式用於例項化乙個物件 或建立乙個物件的例項 而抽象類不能被例項化,所以抽象類不應該有公共的建構函式 fxcop.設計規則 但不應該有 公共 的建構函式,和不應該有建構函式,這是兩個不同的概念,所以,fxcop.設計規則中也說,如果抽象類需要建構函式,...

抽象類定義 為什麼要使用抽象類

為什麼要使用抽象類?有什麼好處?答案 1 現實中一些父類中的方法沒必要寫 各個子類中的方法會有所不同 所以沒必要在父類中寫 2 看被人 時候會注意這是抽象方法 會有個提示作用 3 當看到乙個類是抽象的,要關心他的抽象方法,因為他的子類一定會重寫他,然後去找抽象類的引用,會有多型性的體現 4 物件導向...