using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace _7_11
{
    class BaseClass
    {
        public void NVMeth()
        {
            Console.WriteLine("调用了基类BaseClass类的非虚方法NVMEth");
        }
        public virtual void VMeth()
        {
            Console.WriteLine("调用了基类BaseClass类的虚方法NMeth");
        }
    }
    class InClass : BaseClass
    {
        new public void NVMeth()
        {
            Console.WriteLine("调用了派生类InClass类的非虚方法NVMeth");
        }
        public override void VMeth()
        {
        Console.WriteLine ("调用了派生类InClass类的虚方法NMeth");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            InClass InObj=new InClass ();
            BaseClass BaseObj=InObj;
            BaseObj .NVMeth ();
            BaseObj .VMeth();
            InObj .NVMeth ();
            InObj .VMeth ();
        }
    }
}
为什么结果是:调用了基类BaseClass类的非虚方法NVMEth
            调用了派生类InClass类的虚方法NMeth
            调用了派生类InClass类的非虚方法NVMeth
            调用了派生类InClass类的虚方法NMeth            

解决方案 »

  1.   

     BaseClass BaseObj=InObj;         这句又是什么意思??
      

  2.   

    BaseClass BaseObj=InObj;
    对于virtual方法,这句等于废话。
      

  3.   

    这几句话都是测试用例。那句话让你测试一下,一个InClass类型的对象,是完全可以赋值给一个声明为BaseClass类型的变量去引用的。
      

  4.   

    关于写new public void NVMeth()我会强烈要求“踢出去”不要再做我们的.net程序员了。如果一个程序员明知道(否则就不会特意写上new了)父类有NVMeth方法,它还要故意再写一个同名的方法,它就是“没事找抽”的。这个语法是十几年前c#从c++继承来的糟粕,是严重地违背面向对象设计的基本概念的。(至少我们是)不允许使用。
      

  5.   

    如果你需要在 InClass 中重写NVMeth 方法内容,那么你就正常地重写其内容。就好像 VMeth 那样写。如果你需要在 InClass 中声明一个新的方法,那么就不要故意去起跟继承来的方法同名的方法。也就时不要故意写什么“new”。请记住这个原则。