class Program
{
    static void Main()
    {
        Parent pa = new Parent();
        pa.Say();                   //这个会说"Hello,you are in Parent!"
        Parent pb = new Child();
        pb.Say();                   //这个会说"Hello,you are in Child"
        
        //为什么pa pb 都是相同的Parent类型的,
        //而他们的同一个方法却调用了不同的方法体呢?        //如果问题出在new后面的构造函数上,可以给我解释一下么?
        
        //还有,如果另外还有一个类,里面有一个泛型集合List<Parent>
        //存了pa pb,这时我看不到pa pb 是怎么new 出来的,
        //那我怎么判断pa pb最后会调用自己的方法还是调用子类的方法??
    }
}
class Parent
{
    public string name;
    public Parent() { }    public Parent(string n)
    {
        this.name = n;
    }    public virtual void Say()
    {
        Console.WriteLine("Hello,you are in Parent!");
    }
}
class Child:Parent
{
    public int age;
    public Child() { }    public Child(string n, int a)
        : base(n)
    {
        this.age = a;
    }    public override void Say()
    {
        Console.WriteLine("Hello,you are in Child");
    }
}

解决方案 »

  1.   

    胡乱说说:
    //为什么pa pb 都是相同的Parent类型的
    继承的话,是同一个类型,父类、子类,本质上一样
    但是他们初始化的实例不一样
      

  2.   

    在Parent类中,say方法是一个虚构方法,在Child类中,由于是继承自Parent,且重写(override)了Say方法,
    所以Child类也是一个Parent类型。(你可以把Parent类看成是一个基类,而child类是一个基类的扩展类)
    Parent pa = new Parent();
    pa.Say();  自然就调用父类的Say方法
    而Pb.say();就调用Child的Say方法。至于List<Parent>,就看你怎么实例化了,
    如果是
    List<Parent> pa = new List<Parent>();
    pa.Say();  仍调用Parent中的say方法;List<Parent> pb = new List<Child>();
    pb.Say();  调用Child中的Say方法;
      

  3.   

    参考:
    http://blog.csdn.net/zhuanshen712/archive/2008/12/26/3611573.aspx
    http://blog.csdn.net/zhuanshen712/archive/2008/12/26/3612076.aspx
      

  4.   

    因为后面new的不同的对象
    他就会调用不同的方法
      

  5.   

    呵呵,老外的东西你看不懂没关系,我们来说中国人都懂的事情
    这叫“上有政策,下有对策”一个领导带着手下人去喝酒
    领导说“今天儿高兴,大家都给我喝好了!来一人一瓶酒,我喊‘满上’,你们都给可劲滴喝”
    于是一帮热血青年都拿着酒下去
    不过,现在有A,B两个人,他们都不会喝酒,可领导发话了,咋办呢?
    “上有政策,下有对策”,A把酒瓶里的酒换成了白开水,B把酒瓶里的酒换成了雪碧过一会,领导说“满上”,热血青年们都拿着酒一股脑干了,呵呵,领导高兴了,事情圆满了实际上这个就是如此,表面上看,大家都是一样,实际上已经不一样了
      

  6.   

    Parent pa = new Parent();//声明的是一个Parent类型变量,实例化的也是一个Parent对象Parent pb = new Child();//声明的是一个Parent类型变量,但实例化的是一个Child对象List<T>中的元素是T中的元素,与它的继承类无关
    List<Parent>是无法强制转换为List<Child>的