using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class Parent { public void MethodParent() { Console.WriteLine("0.调用parent的MethodParent()方法"); } public virtual void virtualMethodParent() { Console.WriteLine("1.调用parent的virtualMethodParent()方法"); } } public class Child : Parent { public void MethodChild() { Console.WriteLine("2.调用Child的MethodChild()方法"); } public override void virtualMethodParent() { Console.WriteLine("3.调用Child的virtualMethodParent()方法"); } } class inherit_Polymorphism { static void Main() { Parent par1 = new Parent(); par1.MethodParent(); par1.virtualMethodParent(); //Child child9 = (Child)par1; //编译不报错,运行出错 Console.WriteLine(); Child child1 = new Child(); child1.MethodChild(); child1.MethodParent(); child1.virtualMethodParent(); Console.WriteLine(); //等同于Parent par2 = (Parent)(new Child()); //par2实际为Parent类型,只能调用Parent类的方法MethodParent(),而不能调用Child类的方法MethodChild() //可以通过 虚拟重载 调用Child类的方法virtualMethodParent() Parent par2 = new Child(); par2.MethodParent(); par2.virtualMethodParent(); Console.WriteLine(); //同上 Parent par3 = (Parent)child1; par3.MethodParent(); //除了虚拟重载的方法,只能访问父类的方法,不能访问子类方法 par3.virtualMethodParent(); Console.WriteLine(); //将Child强制转换为Parent后,可以将该Parent强制转换为Child。 //并只有实际上是Child的实例才能可以转换为Child,否则会产生运行错误,例:41行代码 Child child2 = (Child)par3; //par3最初为Child child2.MethodChild(); //对比上面的就能访问子类方法了 child2.MethodParent(); child2.virtualMethodParent(); Console.WriteLine(); Parent child3 = (Child)par3; child3.MethodParent(); child3.virtualMethodParent(); Console.ReadLine(); } } }