给你看段代码就知道了,你需要学习一下基本的OOP编程的知识。对于一个子类对象,如果是重写虚函数,不管你是通过子类还是基类的形式去调,调的都是被重写的子类方法。而对于一个覆盖(Shadow)的函数,如果是通过父类调用的话,那么调用的就是父类函数,通过子类形式调,就是子类方法。 class A { public virtual void f1() { Console.WriteLine("A.f1 is called!"); } public void f2() { Console.WriteLine("A.f2 is called!"); } } class B:A { public override void f1() { Console.WriteLine("B.f1 is called!"); } public new void f2() { Console.WriteLine("B.f2 is called!"); } } class Program { static void Main(string[] args) { A a = new B(); a.f1(); a.f2(); Console.ReadKey(); } }==========输出结果B.f1 is called! A.f2 is called!
{
public virtual void f1()
{
Console.WriteLine("A.f1 is called!");
} public void f2()
{
Console.WriteLine("A.f2 is called!");
} }
class B:A
{
public override void f1()
{
Console.WriteLine("B.f1 is called!");
} public new void f2()
{
Console.WriteLine("B.f2 is called!");
}
}
class Program
{
static void Main(string[] args)
{
A a = new B(); a.f1();
a.f2(); Console.ReadKey();
}
}==========输出结果B.f1 is called!
A.f2 is called!
所以你这个要求无法达到。一般来说,不加virtual就可以了,很少有人用new来屏蔽父类的函数,除非那个人知道这么做的后果。并且,屏蔽父类的函数并不会导致父类的行为异常,所以一般也不会出什么乱子。
我一般这样解决