delphi中关键字inherited

本文探讨了Delphi中的关键字`inherited`在继承链中的作用。通过一个例子展示,当在子类C中使用`inherited`调用函数时,实际执行的是父类B中的方法;同样,在B类中使用`inherited`,则会调用基类A中的方法。这有助于理解Delphi中类的继承和方法调用机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A是基类、B继承A、C继承B、若C函数中有inherited方法,则C中所调用的以及实现的就是全为B中的,同样,B中若有inherited,则B中调用的全为A中的。

 

代码如下:

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    function show:Integer;virtual;
    function NumCount:Integer;virtual;
  end;

  TForm2 = class(TForm1)
  public
    function NumCount:Integer;override;
  end;

  TestA = class
  public
    function TestXX:string;virtual;
  end;
  TestB = Class(TestA)
  public
    function TestXX:String;override;
  End;
  TestC = class
  public
 

### Delphi 中 `inherited` 关键字的使用 在 Delphi 编程中,`inherited` 关键字用于调用父类的方法或访问父类成员。这通常发生在派生类覆盖了基类中的某个方法的情况下,当希望执行基类版本的功能时可以使用此关键字。 #### 调用父类方法 如果子类重写了来自其祖先的一个虚拟方法,则可以通过 `inherited` 来显式地调用这个被继承的方法[^1]: ```delphi type TForm1 = class(TForm) procedure WndProc(var Message: TMessage); override; end; procedure TForm1.WndProc(var Message: TMessage); begin inherited WndProc(Message); // 调用TForm的WndProc方法 end; ``` 上述例子展示了如何在一个自定义表单类中重新定义窗口过程函数 `WndProc` 并确保仍然会调用到由 `TForm` 提供的基础实现。 #### 构造器和析构器中的应用 对于组件或其他对象类型的创建,在动态实例化过程中也会涉及到 `inherited` 的运用。每当创建一个新的 Delphi 组件时都会使用构造器 (Constructor),而这些构造器内部可能会有对 `inherited Create()` 或者其他形式的调用来初始化父级结构[^2]: ```delphi constructor TMyComponent.Create(AOwner: TComponent); begin inherited Create(AOwner); // 初始化父类部分 // 自身特定的初始化代码... end; ``` 这段代码片段显示了一个名为 `TMyComponent` 的组件在其构造期间不仅完成了自身的设置工作还通过 `inherited` 完成了对其直接超类属性和服务的初始化操作。 #### 单元系统的关联 值得注意的是,虽然 `inherited` 主要应用于面向对象编程方面,但在讨论 Delphi 的单元系统工作机制时也间接提到了它的重要性——因为良好的模块划分有助于更好地管理和利用继承关系以及多态性特征[^3]。 #### 类型声明与过程定义间的联系 最后一点关于 `inherited` 的实际应用场景是在类型声明之后的过程体内引用已有的同名成员来扩展行为而不完全替换原有功能[^4]。例如: ```delphi unit UnitExample; interface uses SysUtils; type TBaseClass = class public procedure Greetings; virtual; end; TDerivedClass = class(TBaseClass) public procedure Greetings; override; end; implementation { TBaseClass } procedure TBaseClass.Greetings; begin WriteLn('Hello from base'); end; { TDerivedClass } procedure TDerivedClass.Greetings; begin inherited Greetings; // 执行基础类别的问候语句 WriteLn(', and hello again from derived!'); end; end. ``` 在这个案例里,`TDerivedClass` 对象会在调用它的 `Greetings` 方法时先输出一次来自 `TBaseClass` 的消息然后再追加一条额外的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值