type
  TFigure=class
    procedure Draw;
  end;
  TRectangle=class(TFigure)
    procedure Draw;
  end;
var
  Figure:TFigure;
  Rectangle:TRectangle;
begin
  Figure:=TFigure.create;
  Figure.Draw;    //调用的是TFigure.Draw;
  Figure.Destroy;
  Figure:=TRectangle.create;
  Figure.Draw;    //调用的是TFigure.Draw,为什么?;
  TRectangle(Figure).Draw;  //调用的是TRectangle.Draw
  Figure.Destroy;
  Rectangle:=Trectangle.Create;  //调用的是TRectangle.Draw
  Rectangle.Draw;
  Rectangle.Destroy;

解决方案 »

  1.   

    1L精辟,LZ看下override的资料吧
      

  2.   

      TFigure=class
      procedure Draw;virtual;
      end;
      TRectangle=class(TFigure)
      procedure Draw;override;
      end;
      

  3.   

      Figure:=TRectangle.create;
      Figure.Draw; //调用的是TFigure.Draw,为什么?;
     Figure为TFigure类型,多态是楼上形式的,还分为类有继承关系的和没有继承关系的两种。
      

  4.   

    Figure.Draw; //调用的是TFigure.Draw,为什么?;
    因为Figure是TFigure类型的,所以调用的是TFigure的方法。
    如果你这样写,就是子类的了。如下向下转型的方法。
    TRectangle(Figure).Draw;
      

  5.   

    这个问题主要涉及delphi的对象模型,对象模型弄通了,这类问题就都通了。