using System;namespace ConsoleApplication1
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class A
    {
        public void aaa()
        {
            System.Console.Write("A:aaa");
        }
        public virtual void bbb()
        {
            System.Console.Write("A:bbb");
        }
    }
    class B : A
    {        public void aaa()
        {
            System.Console.Write("B:aaa");
        }
        public override void bbb()
        {
            System.Console.Write("B:bbb");
        }
        public void ccc()
        {
            System.Console.Write("B:ccc");
        }
    }
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            A a = new A();
            B b = new B();
            a.aaa();
            a.bbb();
            b.aaa();
            b.bbb();
            b.ccc();
            /// 问题就在下面的代码中
            a = b;
            a.aaa();
            a.bbb();            Console.ReadLine();
        }
    }
}问题:
1.a = b 的实质是什么
2.“a.aaa();a.bbb();”第一个方法为什么调用的不是b的aaa() , 而是a的aaa();

解决方案 »

  1.   

    推荐找一本C#的书你看一下“继承”这一章就明白了。我这有一本PDF格式的,你要的话发给你好了。
      

  2.   

    类是引用变量,也就是说具体的数据是在堆中保存的,而变量名只是相当于指向具体数据的指针 a=b 是让a也同样指向b的内容。所以在a=b之后执行a.aaa()和b.aaa()都是执行class b 的方法
      

  3.   

    这个我看的书上也没有这方面的解释。2.“a.aaa();a.bbb();”第一个方法为什么调用的不是b的aaa() , 而是a的aaa();
    因为在这时A a = new A();他所实例化的类是A,所以调用的不是b的aaa() 。而在这之后将a = b;因为B : A,a = b时b隐形转换成a,又因为bbb()声明为virtual,更具virtual的定义:对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。也就是因为B在继承A后override了bbb(),所以在最后的a.bbb();时调用的是重载后bbb()也就是类B的bbb()方法。至于1.a = b 的实质是什么,这个我也不知道:( 麻烦其他人补充。
      

  4.   

    楼上的这一点错了:所以在a=b之后执行a.aaa()和b.aaa()都是执行class b 的方法a.aaa();执行的是A的aaa()方法而不是B的aaa()方法,你可以运行一下代码。