virtual 關鍵字用於修改方法、屬性、索引器或事件宣告,並使它們可以在派生類中被重寫。 例如,此方法可被任何繼承它的類替代:
public virtual double area()
虛擬成員的實現可由派生類中的替代成員更改。
備註呼叫虛擬方法時,將為替代的成員檢查該物件的執行時型別。 將呼叫大部分派生類中的該替代成員,如果沒有派生類替代該成員,則它可能是原始成員。
預設情況下,方法是非虛擬的。 不能替代非虛方法。
virtual 修飾符不能與 static、abstract, private 或 override 修飾符一起使用。 以下示例顯示了虛擬屬性:
class mybaseclass
// ordinary virtual property with backing field
private int num;
public virtual int number
set
}
class myderivedclass : mybaseclass
setelse}}
}除宣告和呼叫語法不同外,虛擬屬性的行為與抽象方法相似。
在靜態屬性上使用 virtual 修飾符是錯誤的。
通過包括使用 override 修飾符的屬性宣告,可在派生類中替代虛擬繼承屬性。
示例在該示例中,shape 類包含 x、y 兩個座標和 area() 虛擬方法。 不同的形狀類(如 circle、cylinder 和 sphere)繼承 shape 類,並為每個圖形計算表面積。 每個派生類都有各自的 area() 替代實現。
請注意,繼承的類 circle``sphere 和 cylinder 均使用初始化基類的建構函式,如下面的宣告中所示。
public cylinder(double r, double h): base(r, h) {}
根據與方法關聯的物件,下面的程式通過呼叫 area() 方法的相應實現來計算並顯示每個物件的相應區域。
class testclass
public shape(double x, double y)
public virtual double area()
}public class circle : shape
public override double area()
}class sphere : shape
public override double area()
}class cylinder : shape
public override double area()
}static void main()
", c.area());
console.writeline("area of sphere = ", s.area());
console.writeline("area of cylinder = ", l.area());
}}/*
output:
area of circle = 28.27
area of sphere = 113.10
area of cylinder = 150.80
*/
C virtual關鍵字理解
在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...
C virtual關鍵字理解
在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...
C virtual關鍵字理解
在c 語言中,從 到程式的執行,要經歷編譯和連線,針對這兩個不同的階段,c 設計了不同的機制,其中vitual和inline就是區分編譯器工作和鏈結器工作的標誌 inline很容易理解,生命為inline的函式在編譯階段即被展開成 而非inline的函式採用執行時鏈結的方式處理 vitual關鍵字,...