using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DirClass dir = new DirClass(5, 6);
            dir.Test();
            BasicClass jj = dir as BasicClass;
            jj.Test();
           
            Console.ReadLine();
        }
    }
    public class BasicClass
    {
        public virtual void Test()
        { }
    }
    public class DirClass:BasicClass
    {
       public int x;
       public int y;
        public DirClass(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
        public override void Test()
        {
            Console.WriteLine("x={0}\ty={1}", x, y);
        }
    }
}我基类的Test()方法为什么可以访问派生类的xy呢?我知道这个jj.Test()会调用派生类的Test()方法,但是不知道怎么会访问到x,y。
基类类型的派生类变量不是指向派生类里基类的东西吗?就是派生类实例化的时候就要实例化基类,所以他有基类的所有东西。用基类型来
访问的时候就是访问派生类里基类的东西,现在怎么就可以把xy都显示?
谢谢帮助,请一一回答我的问题。

解决方案 »

  1.   

      public override void Test()
            {
                Console.WriteLine("x={0}\ty={1}", x, y);
            }
    这个方法里面访问自己的x,y有什么不行的??
      

  2.   

    1、dir是派生类的对象,jj是基类对象引用了该派生类的对象dir,其实这里相当于利用派生类创建了一个基类的对象
    2、virtual函数的作用,基类对象指向派生类的对象时候将会调用派生类中实现的virtual函数代码。
    3、此时调用的test就相当于派生类对象本身调用自己的test方法,而方法里面本身就调用了x和y,当然看上去就是父类的对象调用了派生类的自身变量。
      

  3.   


    把一个基类函数声明为virtual,该函数就可以在派生类中重写。
      

  4.   

    你一个对象被new了,只是换"皮"而已我觉得没什么好奇怪吧,另外楼主说法可能不准确,jj.x //error
    jj.y //error//only
    jj.Test();不存在 jj能够访问x,y的问题,最后打印出结果是因为调用了那个唯一被new出对象中定义的Test()方法而已..
      

  5.   

    基本上明白!其实是派生类自身调用类Test()方法,看上去是基类调用。
    谢谢