type
  TFigure = class
    procedure Draw;
  end;
  TRectangle = class(TFigure)
    procedure Draw;
  end;
...
var
  Figure: TFigure;
  Rectangle: TRectangle;
begin 
  ...
  Fingure := TRectangle.Create; *1
  ...
  TRectangle(Fingure).XXX; *2
  ...
end; 
*1
TRectangle作为TFingure的子类,是TFingure的扩充,那用TRectangle创建对象赋给Fingure不是意味着TRectangle扩充的数据被丢失了吗?
*2
把Fingure强制类型转换成TRectangle,那TRectangle扩充的数据(包括函数和方法)是如何处理的呢?总之,子类应该包含(或覆盖)父类的数据,当这两者进行类型转换的时候,他们的数据是如何处理的,鄙人实在是菜鸟一个,连这么一个简单的问题都搞不清楚,sigh

解决方案 »

  1.   

    首先,你问的问题并不简单。*1中创建的是TRectangle的实例,对该实例的引用(指针)却保存在TFingure类型的变量中,所以Fingure变量访问TRectangle扩展的属性是非法的,因为TFingure类型检查不通过。但可以将Fingure强制转换为TRectangle进行访问。
    *2会出现问题,当你创建的是父类的实例,却访问子类扩展的属性,会因为找不到对应的地址而出错总之,记住创建的是谁的实例,向上的转化是安全的。变量只不过保存的是对该实例的引用(指针)而已