调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual 修饰符不能与 static、abstract 和 override 修饰符一起使用。
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
-
在静态属性上使用 virtual 修饰符是错误的。
-
通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性
using System;
using System.Collections.Generic;
using System.Text;namespace virtul
{
class Sias
{
static void Main(string[] args)
{
//string Sname="barney";
//int SNum = 20051054172;
//student s = new student(Sname, SNum);
//moiniter m=new moiniter(
student[] Stuarray=new student[5];
Stuarray[0] = new student("barney", 72);
Stuarray[1] = new moiniter("barneyyuan", 72);
Stuarray[2] = new vicemonitor("yuanzheng", 72);
Stuarray[3] = new Designer("yuan", 72);
Stuarray[4] = new Designer("zheng", 72);
foreach(student s in Stuarray)
{
s.learn();
}
}
}
class student
{
protected string Name;
protected int StuNum;
public student( )
{
}
public student(string Name, int StuNum)
{
this.Name = Name;
this.StuNum=StuNum;}
public virtual void learn()
{
Console.WriteLine("学生:"+Name+"开始学习");
}
}class moiniter:student
{
/// <summary>
/// base 调用父类的构造函数
/// </summary>
/// <param name="Name"></param>
/// <param name="StuNum"></param>
public moiniter(string Name, int StuNum) : base(Name, StuNum) { }
public override void learn()
{
base.learn();//调用基类的构造函数;
Console.WriteLine("组长开始发任务");
}
}
class vicemonitor: student
{public vicemonitor(string Name, int StuNum) : base(Name, StuNum) { }
public override void learn()
{
base.learn();
Console.WriteLine("副组长开始工作");
}
}
class Designer: student
{public Designer(string Name, int StuNum) : base(Name, StuNum) { }
public override void learn()
{
base.learn();
Console.WriteLine("强人工作室设计人员开始工作");
}
}
}