这个要看你的引用了,如果你用子类创建的对象,那么自然是子类的方式。如果用你类的引用的,就是父类的方法。
比如:
class BaseClass {
public virtual void A(){}
}
class ExtendClass : BaseClass {
public overwrite void A(){}
}
这时如果是 ExtendClass a = new ExtendClass(); a.A(); //子类方法
如果是BaseClass a = new ExtendClass(); a.A(); //子类方法
如果是BaseClass a = new BaseClass(); a.A(); //父类方法
是的,是按你定义的那个变量的类型来执行
重写的含义是:子类不想再隐式继承父类同名方法,它想拥有自己的同名方法以输出不同的内容——并不会对父类原有方法造成改变
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
//父类
public class FatherClass
{
public virtual void F()
{
Console.WriteLine("父类方法");
}
}
//子类1 重写父类方法
public class ChildClass1:FatherClass
{
public override void F()
{
Console.WriteLine("子类1方法");
}
}
//子类2 在子类1重写了父类方法后,再次调用父类方法,看父类方法是否发生了改变,即是否变成了子类1重写的方法
public class ChildClass2: FatherClass
{
}
//主函数类
class Program
{
static void Main(string[] args)
{
ChildClass1 cc1 = new ChildClass1();
cc1.F();//输出结果是“子类1方法”
ChildClass2 cc2 = new ChildClass2();
cc2.F();//输出结果仍然是是“父类方法”
Console.ReadKey();
}
}
}
class Program
{
public Program()
{
Console.WriteLine("父类构造方法");
}
public virtual void show()
{
Console.WriteLine("父类同名方法");
}
}
class sonProgram : Program
{
public sonProgram()
{
Console.WriteLine("子类构造方法");
}
public override void show()
{
Console.WriteLine("子类同名方法");
}
}
public class demo
{
public static void Main(string[] args)
{
Program pr = new sonProgram();
pr.show(); //父类构造方法 子类构造方法 子类同名方法
Program p = new Program();
pr.show(); //父类构造方法 子类同名方法
}
}
要养成这个习惯遇到什么疑问就去用程序来证明,你说的这个是 直接执行子类的方法,父类方法被覆盖了
是的啊 嗯