直接看代码就知道了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 虚函数
{
class Base
{
virtual public void outClassName()
{
Console.WriteLine( "基类" );
}
virtual public void outPut()
{
Console.WriteLine("基类");
}
}
class FirstDerived : Base
{
override public void outClassName()
{
Console.WriteLine("第一个派生类的outClassName方法");
}
override public void outPut()
{
Console.WriteLine("第一个派生类中的outPut方法");
}
}
class SecondDerived : FirstDerived
{
public override void outClassName()
{
Console.WriteLine("第二个派生类的outClassName方法");
}
new public void outPut()
{
Console.WriteLine("第二个派生类中的outPut方法");
}
}
class Program
{
static void Main(string[] args)
{
SecondDerived sd = new SecondDerived();
Base base1 = (Base)sd;
base1.outPut();//第一个派生类中的outPut方法
base1.outClassName();//第二个派生类的outClassName方法
}
}
}
图解C#中的原话:
当使用对象基类部分的引用调用一个覆写的方法,方法的调用被沿着派生类层次上朔执行,一直到被标记为override的方法的最高派生版本。 这句话的关键词是 沿着派生类层次上朔执行, 直到, 标记为override的方法
也就是说如果是不会上溯到new标记的方法的。
使用new的话,按照我的理解是 ——切断该方法与父类(父类的父类。。。)中同名同标签的方法的联系,因此
new public void outPut()
{
Console.WriteLine("第二个派生类中的outPut方法");
}
这个方法和父类中的void outPut( )方法没有任何关系了。动态绑定自然轮不到这个方法了。