using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{    class Program
    {        static void Main(string[] args)
        {            //BaseClass mybase = new BaseClass();            BaseClass myChild = new ChildClass();            BaseClass myOverride = new OverrideClass();            myChild.getBase("leening");            myOverride.getBase("leening");            Console.Read();        }    }    public class BaseClass
    {
        public virtual void getBase(string name)
        {            Console.WriteLine("base:my name is " + name);        }
    }    public class ChildClass : BaseClass
    {
        public new void getBase(string name)
        {            Console.WriteLine("child:my name is " + name);        }    }    public class OverrideClass : BaseClass
    {        public override void getBase(string name)
        {            Console.WriteLine("override:my name is " + name);        }    }
}
输出:base:my name is leening   override:my name is leening请问BaseClass myChild = new ChildClass();这个是什么意思?一个基类的 myChild ,用子类的构造函数去初始化
结果调用的是基类的构造函数,有点晕了
请假为什么会得出这个结果?

解决方案 »

  1.   

    子类中没有重构父类的构造函数,子类继承父类的构造函数,new方法是在子类中新创建一个同名的方法,override重写父类的方法,覆盖原来的
      

  2.   

    BaseClass myChild = new ChildClass();
    这一句等同于
    ChildClass myChild = new ChildClass();
    BaseClass是父类,ChildClass是子类。
    如果BaseClass和ChildClass存在继承关系,就可以这样写。
    不能写成ChildClass myChild = new BaseClass();
      

  3.   

    那我想调用new出来的方法要怎样调用?
      

  4.   

    用 as 运算符转化为包含new方法的那个类的类型后再调用。
      

  5.   

    你可以查询一下msdn上关于对象的实例化方法。假设你没有给子类显示地定义实例化方法,对于无参数的实例化方法,那么c#会默认地自动给你实现一个:public ChildClass(): BaseClass{}
    这个叫做委派调用,而不是什么继承。这种“自动实现无参数实例化方法”的机制是学生考试时必考的题目。对有参数的实例化方法,不会自动实现。因此如果你调用了有参数实例化,那么编译器就会给你报错,而不是自动实现你的new方法了!
      

  6.   

    嗯,修改一下示意代码:public ChildClass(): base{}
      

  7.   

    这个 还是 要 从内存分配着手。
    BaseClass myChild = new ChildClass();
    //右边  实例化,实际上 它的类型句柄指向了 父类和自己的getBase方法。姑且算分配有两个getBase方法,BaseClass.getBase 和 ChildClass.getBase。
    //左边  只是类型转换而已,只是把能够转换的,属于基类,继承基类的进行转换
      

  8.   

    这个的问题不应该是构造函数吧,而是两个子类一个是new覆盖,一个是override重写的区别