class A
    {
        public A()
        { Console.WriteLine("a"); }
        public virtual void Hello()
        { Console.WriteLine("HA"); }
        public void M()
        { Console.WriteLine("M"); }
    }
    class B : A
    {
        public B()
        { Console.WriteLine("b"); }
        public override void Hello()
        {
            Console.WriteLine("HB");
        }    }
    class C : B
    {
        public C()
        { Console.WriteLine("c"); }
        public override void Hello()
        {
            Console.WriteLine("HC");
        }
    }
 static void Main(string[] args)
        {            B b = new C();
            b.Hello();
            b.M();            Console.ReadLine();        }
这个主函数中不是没有调用构造函数吗?为什么会输出A,B,C

解决方案 »

  1.   

    B b=new C();是什么意思?是把子类C的方法赋给类B吗?
      

  2.   

    带参数的构造函数要调用父类的构造函数,需要显式写上 base 关键字来调用。但是无参构造函数则不需要,c#会自动生成调用base的语句。
      

  3.   

    B b = new C();
    这句话就是调用构造函数创建对象。
      

  4.   


    一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。变量b虽然定义为类型B,但是运行时它引用了一个C类实例化对象。这就好像我们说“1234号病人是住院部病人,4567号病人是门诊病人”,我们生活中时时刻刻会使用多态的用法。面向对象编程设计中正是对应这种自然而然的习惯的。
      

  5.   

    一个C实例它就是一个B实例,这就好像说“白马是马、黑马也是马”一样。C继承自B,因此C的实例可以多态地用在B类实力操作中。你上面说的“把.....方法赋给......”就是“多态”的意思(虽然你的说法并不完全正确)。我不知道能不能这样说,既然C的实例可以多态地用在B类实力操作中,那为什么还要调用B的构造函数呢?
      

  6.   

    大神,想问下完整的输出内容是什么?就只有ABC?