using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace VirMethod
{
    public class Person
    {        public string name;
        public int age;
        public Person(string name, int age)
        {            this.name = name;
            this.age = age;
        }
        public Person() { }
        public void getInfo()
        {            Console.WriteLine(name);
            Console.WriteLine(age);
        }
        public virtual void WriteInfo()
        {            Console.WriteLine("Person的信息");
        }
    }
    public class student : Person
    {        public string school;
        public void study()
        {            Console.WriteLine("Studding");
        }
        public override void WriteInfo()
        {
            //base.WriteInfo();
            Console.WriteLine("Student的信息");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.name = "张三";
            p.age = 28;
            p.WriteInfo();
            p.getInfo();
            
            student s = new student();
            p = s;
            s.name = "李四";
            s.age = 18;
            p.WriteInfo();
            s.WriteInfo();
            s.getInfo();
            p.getInfo();  //为什么这里的输出会和s.getInfo();一样呢?person的getInfo并没有用虚方法重写啊?
            Console.ReadLine();        }
    }
}
 student s = new student();
            p = s;
            s.name = "李四";
            s.age = 18;
            p.WriteInfo();
            s.WriteInfo();
            s.getInfo();
            p.getInfo();  //为什么这里的输出会和s.getInfo();一样呢?person的getInfo并没有用虚方法重写啊?
            Console.ReadLine();s.getInfo();和p.getInfo(); 输出的值都是李四,18,怎么会这样呢?纠结啊,难道是P=S的原因吗?但我调式的时候看见P.getInfo()调用的是person里面的getInfo()方法的啊。但输出来的值却不是person里面的值(张三,28)?
请高手帮忙解释一下啊。谢谢

解决方案 »

  1.   

    //为什么这里的输出会和s.getInfo();一样呢?person的getInfo并没有用虚方法重写啊?getinfo方法继承s.getInfo();和p.getInfo(); 输出的值都是李四,18,是p=s的原因,具体参考引用类型和值类型的区别
      

  2.   

    但我调式的时候看见P.getInfo()调用的是person里面的getInfo()方法的啊。因为子类没有申明getInfo(),所以调用的是父类的方法,从父类继承过来,但调用的时候还是使用父类的
      

  3.   

    p = s;
    现在p就是s了...
    肯定一样的
    virtual 加上,表示可以把实现放在子类
    virtual 不加,只是表示在本类中也会实现,不影响多态的使用
      

  4.   

    你其中写了:p=s;这个表示p指向s所指的位置了。
    所以,后面执行的p.getInfo(),就等同于s.getInfo()