在子类的同名方法中用inherited来调用父类同名方法
哪怕没有override关键字
taaa = class
    procedure msg;
  end;  tbbb = class(taaa)
    procedure msg;
  end;procedure taaa.msg;
begin
   ShowMessage('taaa.msg');
end;procedure tbbb.msg;
begin
  ShowMessage('tbbb.msg');
  inherited;
end;
override是可有可无的?还是说delphi在编译时作了处理?

解决方案 »

  1.   

    override是和父类的virtual方法结合一起用的,不过好像也没见过在哪里说inherited一定要和这些在一起才可以使用的,inherited提供调用父类里面的方法,你可以在父类多加几个过程比如msg2,msg3,然后在子类里面用inherited msg2;inherited msg3也是可以的,不一定要同名方法,同名方法是子类和父类的方法名一样的时候可以省略。
      

  2.   

    忘记了override还是可以和父类动态方法dynamic一起用的,
      

  3.   

    override是用来覆盖基类的虚拟方法(包含动态方法)的,这是面向对象里实现多态的一个重要因素。二楼的说的没错,Inherited不一定只有虚拟方法才能用,一般的方法也行,消息处理函数也可以。
    如果没有用Virtual和Inherited关键字,父类和子类的同名方法是两个不同的方法,只是在子类里父类的同名方法被隐藏了,不是覆盖,有点类似于重载。
    看下面的代码是怎么回事
    var A:Taaa;
    A:=Tbbb.Create;
    A.msg;//以Taaa类来调用,显示taaa.msg
    它调用的是父类的Msgy方法,子类有没有这个方法都无所谓都会成功能
    如果你想调用子类的方法必须进行类型转换如下
    (A as Tbbb).msg;//以Tbbb类来调用,先显示taaa.msg后显示Tbbb.s=msg
    再看下面的代码:
    var     B:Tbbb;
    B:=Tbbb.Create;
    B.msg//以Tbbb类来调用,先显示taaa.msg后显示Tbbb.s=msg
    (B as Taaa).msg;//以Taaa类来调用,显示taaa.msg
    这时不会跟你对象的实际类型有关系。
    非虚拟方法是静态的,其地址是在编译时由编译器分配的,代码是死的,说简单点你用哪个类来调用,它就调用哪个的静态方法,父类是不可能调用到子类的方法的。 使用虚拟方法就是为国让父类能调用到子类的方法,如果Taaa.msg定义为虚拟方法,然后Tbbb类对它进行重写,那下面的代码将显示相同的结果: 先显示taaa.msg后显示Tbbb.s=msg
    var A:Taaa;
    A:=Tbbb.Create;
    A.msg;
    (A as Tbbb).msg;
    上面调用的都是Tbbb.msg。
    让父类能够以一种统一方式来调用方法而不管理创建的是哪个子类的实例,这正时面向对象编程思想的精妙之处。
    可以去看看OO方面的书。
      

  4.   

    override是用来改写虚函数的,和inherited没什么关系。
    inherited就是调用父类的方法,可以是父类的任何方法(不包括私有成员),c++是在子类中使用“父类名::函数名”这种方式,而delphi就是使用“Inherited 函数名”这种方式,如果是调用同名函数(参数相同),函数名可以省略,这体现了类的继承性。
    virtual是声明一个虚函数,override对应是改写父类的一个虚函数,这体现了类的多态性,类的多态性必须靠虚函数才能实现,因为只有虚函数会在运行期绑定(虚函数表),达到父类可以“变成”任何一个子类形态去调用子类的虚函数。