虛方法 重寫方法和抽象方法

2021-05-23 21:26:54 字數 2183 閱讀 6049

若乙個例項方法的宣告中含有

virtual

修飾符,則稱該方法為虛方法

(virtual method)

。若其中沒有

virtual

修飾符,則稱該方法為非虛方法

(non-virtual method)

在呼叫乙個虛方法時,該呼叫所涉及的那個例項的執行時型別

(runtime type)

確定要呼叫該方法的哪乙個實現。在非虛方法呼叫中,例項的編譯時型別

(compile-time type)

負責做出此決定。

虛方法可以在派生類中重寫

(override)

。當某個例項方法宣告包括

override

修飾符時,該方法將重寫所繼承的具有相同簽名的虛方法。虛方法宣告用於引入新方法,而重寫方法宣告則用於使現有的繼承虛方法專用化(通過提供該方法的新實現)。 抽象

(abstract)

方法是沒有實現的虛方法。抽象方法使用

abstract

修飾符進行宣告,並且只允許出現在同樣被宣告為

abstract

的類中。抽象方法必須在每個非抽象派生類中重寫。

下面的示例宣告乙個抽象類

expression

,它表示乙個表示式目錄樹節點;它有三個派生類

constant

、variablereference

和operation

,它們分別實現了常量、變數引用和算術運算的表示式目錄樹節點

using system;

using system.collections;

public abstract class expression

public class constant: expression

public override double evaluate(hashtable vars) }

public class variablereference: expression

public override double evaluate(hashtable vars)

return convert.todouble(value);}}

public class operation: expression

public override double evaluate(hashtable vars)

throw new exception("unknown operator");}}

上面的四個類可用於為算術表示式建模。例如,使用這些類的例項,表示式x+

3可如下表示。

expression e = new operation(

new variablereference("x"),

'+',

new constant(3));

**中呼叫了

expression

例項的evaluate

方法,以計算給定表示式的值,從而生成乙個

double

值。該方法接受乙個包含變數名稱(作為雜湊表項的鍵)和值(作為項的值)的

hashtable

作為引數。

evaluate

方法是乙個虛抽象方法,意味著非抽象派生類必須重寫該方法以提供具體的實現。

constant

的evaluate

實現只是返回所儲存的常量。

variablereference

的實現在雜湊表中查詢變數名稱,並返回產生的值。

operation

的實現先對左運算元和右運算元求值(通過遞迴呼叫它們的

evaluate

方法),然後執行給定的算術運算。

下面的程式使用

expression

類,對於不同的x和

y 值,計算表示式x*

(y+2)的值。

using system;

using system.collections;

class test

}

2014 03 16 虛方法和重寫方法

物件導向程式設計的三大特徵之一 多型,而實現多型的乙個主要表現形式就是子類重寫基類的虛方法或函式成員。虛方法 關鍵字 virtual 虛方法的訪問修飾符不能是私有的,否則子類無法繼承和重寫 重寫方法 關鍵字 override 重寫基類的虛方法時,訪問修飾符需要和基類虛方法保持一致 重寫和過載的區別 ...

c 複習 虛方法 重寫方法和抽象方法 官方解釋

若乙個例項方法的宣告中含有 virtual 修飾符,則稱該方法為虛方法 virtual method 若其中沒有 virtual 修飾符,則稱該方法為非虛方法 non virtual method 在呼叫乙個虛方法時,該呼叫所涉及的那個例項的執行時型別 runtime type 確定要呼叫該方法的哪...

C 虛方法和抽象方法

虛方法 1 virtual方法表示此方法可以被重寫,也就是說這個方法具有多型.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯.2 virtual方法可以直接使用,和普通方法一樣 3 不是必須重寫的.子類可以使用base.方法 的方式呼叫,無論有沒有在子類使用override去重寫 vir...