using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
class Program
{
static void Main(string[] args)
{
//第一種情況
A a = new B();//x=1,y=0
a.PrintFields();//x=1,y=-1
//因爲構造B之前,先執行變量,y沒有明確賦值,默認爲0。執行B的構造函數,
//因爲B繼承A,所以先執行A的構造函數。A構造函數調用的PrintFields方法在A類裏是虛函數,它的實現是在B類,
//所以執行B類的PrintFields方法,結果輸出。雖然繼續執行完B的構造函數,使y的值是-1.但結果之前已經輸出
//第二種情況
B b = new B();//x=1,y=0
b.PrintFields();//x=1,y=-1
//因爲構造B之前,先執行變量,y沒有明確賦值,默認爲0。執行B的構造函數,因爲B繼承A,所以先執行A的構造函數。
//A構造函數調用的PrintFields方法在A類裏是虛函數,它的實現是在B類,所以執行B類的PrintFields方法,結果輸出。
//雖然繼續執行完B的構造函數,使y的值是-1.但結果之前已經輸出
//第三種情況
A c = new A();
c.PrintFields();//什麼都不輸出
Console.ReadKey();
}
}
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields()
{ }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
}
有關繼承的典型例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.