C#容許派生類中的方法與基類中方法具備相同的簽名:基類中使用關鍵字virtual定義虛方法;而後派生類中使用關鍵字override來重寫方法,或使用關鍵字new來覆蓋方法(隱藏方法)。html
重寫方法用相同的簽名重寫所繼承的虛方法。虛方法聲明用於引入新方法,而重寫方法或隱藏方法聲明則是用於使現有的繼承虛方法專用化(經過提供該方法的新實現)ide
注意:若是簽名相同的方法在基類和派生類都進行了聲明,但該方法沒有聲明爲virtual和override/new,則派生類方法就會隱藏基類方法,但系統編譯時會產生警告信息。由於隱藏方法會存在爲給定類的實例調用錯誤方法的危險,故應該顯示地定義隱藏方法。this
調用虛方法時,將首先檢查該對象的運行時類型,並調用派生類中的該重寫成員。若是沒有派生類重寫該成員,則調用其原始數據。spa
默認狀況下,C#方法是非虛擬的。不能重寫非虛方法,重寫非虛方法將致使編譯錯誤。code
除了類方法外,還能夠使用virtual關鍵字其餘類成員以定義虛成員,包括屬性【無參屬性】、索引器【含參屬性】或事件聲明。虛擬成員的實現可在派生類使用關鍵字override來重寫;或使用關鍵字new來覆蓋。htm
注意:virtual 修飾符不能與static、abstract、private或override修飾符一塊兒使用。對象
例:繼承
虛方法,重寫方法和隱藏方法示例:Dimensions類包含x,y兩個座標和Area()虛方法。Dimensions類的派生類(Circle、Cylinder和Sphere)均重寫了基類的虛方法Area()以實現不一樣圖形表面積的計算。調用虛方法Area()時,將根據此方法關聯的運行時對象調用適當的Area()實現,爲每一個圖形計算並顯示適當的面積。索引
1: namespace ConsoleApplication2
2: {
3:
4:
5:
6: public class Dimensions
7: {
8:
9: public const double PI = Math.PI;
10: protected double x, y;
11: public Dimensions()
12: {
13:
14: }
15:
16: public Dimensions(double x, double y)
17: {
18: this.x = x;
19: this.y = y;
20: }
21:
22: public virtual double Area()
23: {
24: return x * y;
25: }
26:
27: }
28:
29: public class Circle : Dimensions //派生類:圓
30: {
31: public Circle(double r)
32: : base(r, 0)
33: {
34:
35: }
36:
37: public override double Area()
38: {
39: //園的面積
40: return PI * x * x;
41: }
42: }
43: public class Sphere : Dimensions //派生類:球體
44: {
45: public Sphere(double r)
46: : base(r, 0)
47: {
48:
49: }
50:
51: public override double Area()
52: {
53: //球體的表面積
54: return 4 * PI * x * x;
55: }
56: }
57: public class Cylinder : Dimensions //派生類:圓柱體
58: {
59: public Cylinder(double r)
60: : base(r, 0)
61: {
62:
63: }
64:
65: public override double Area()
66: {
67: //圓柱體的表面積
68: return 2 * PI * x * x + 2 * PI * x * y;
69: }
70: }
71:
72: public class Program
73: {
74:
75:
76: static void Main(string[] args)
77: {
78: double r = 3.0, h = 5.0;
79: Dimensions c = new Circle(r); //圓
80:
81: Dimensions s = new Sphere(r); //球體
82:
83:
84: Dimensions l = new Cylinder(r); //圓柱體
85:
86: //顯示各類不一樣形狀的表面積
87:
88: Console.WriteLine("圓的面積={0:f2}",c.Area());
89: Console.WriteLine("球體的面積={0:f2}", s.Area());
90: Console.WriteLine("圓柱體的面積={0:f2}", l.Area());
91: Console.ReadKey();
92: }
93: }
94: }