class Program
    {
        static void Main(string[] args)
        {
            GeometricObject g = new Circle(); //父类型引用指向子类型对象g.draw(); 
            g.draw(); //draw调用的是哪个类的方法?如果g换成Circle类引用呢?
            //如果Circle类不覆盖draw方法,调用的是哪个类的方法? 
            //double d = g.getArea(); // 编译时能否通过。
            Console.ReadKey();
        }
            }
    class GeometricObject
    {
        public virtual void draw() { Console.WriteLine("GeometricObject!"); }
    }
    class Ellipse : GeometricObject
    {
        public override void draw() { Console.WriteLine("Ellipse!"); }
        public void getvecter() { }
    }
    class Circle : Ellipse
    {
        public  void draw() { Console.WriteLine("Circle!"); }
        public double getArea() { return 1.0; }
    }
   这段代码运行出来为什么回事Ellipse,而不是GeometricObject?  new的规则不是看引用的类型吗?

解决方案 »

  1.   

    你的那几个问题。。调用的都是Circle里的Draw方法,其实你这些问题都可以自己去测试的啊
      

  2.   

    GeometricObject g = new Circle(); 
    g.draw(); 
    Console.ReadKey();
    我其实是想问这样子主函数执行下来的结果是  Ellipse,为什么啊、
    我看了继承的机制也没怎么明白、还望赐教啊、
      

  3.   

    是粗心了吧?class Circle中draw()
    是否缺少override ?
      

  4.   

    不是的、我知道加了override之后会得到circle的结果、
    我只是想知道为什么像我现在这样写得到的是Ellipse
      

  5.   

    GeometricObject 可以修改为interface试试
    结果很明显嘛,子类继承了父类的行为和特征,
    那么反过来,要知道父类的行为和特征,是不是可以从每个派生类中找到其父类的行为和特征呢?
    GeometricObject g = new Circle(); //父类型引用指向子类型对象g.draw();
    其实就是从子类Circle 得到父类的行为的,g.draw() 调用的是父类的方法,
    只不过方法被子类重写了,具体实现被子类改变了。
    class test:GeometricObject
    {
    }
    GeometricObject g = new test();  g.draw() 就是引用父类的方法了,实现没被test()子类修改,
    与父类的行为一致。