Delphi的OverRide、OverLoad和Virtual方法

本文详细介绍了Delphi中的方法重写(Overriding)和重载(Overloading)的概念,以及virtual、dynamic、override等关键字的使用场景与区别。通过实例解释了如何在子类中覆盖父类方法以及在同一类中定义多个同名方法。

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

Delphi的OverRide、OverLoad和Virtual方法

1.方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

2. Delphi 的函数覆盖(Override)与重载(overload)
而Delphi 就是用override 关键字来说明函数覆盖的。被覆盖的函数必须是虚(virtual)的,或者是动态(dynamic)的,也就是说该函数在声明时应该包含这两个指示字中的一个,比如:

procedure Draw; virtual;

在需要覆盖的时候,只需要在子类中用override 指示字重新声明一下就可以了。

procedure Draw; override;

3.virtual 虚类型
  dynamic 动态
  overload 重载
  override 重写 

4.★★★关于方法定义关键字的说明:

    如果在过程定义声明时包括了的关键字的含义:
    static 表示是静态方法;静态方法是方法的缺省类型,不能被覆盖;
    virtual 表示是虚拟方法;
    dynamic 表示是动态方法;
    这两类方法的共同点是都可以被覆盖(override),区别仅在于运行时调用方法时的派发机
制,virtual方法为执行速度做了优化,而dynamic方法则为代码大小做了优化;经常被覆盖的
方法应该定义为virtual方法;
    message 表示是消息处理方法;在关键字message后面的值指明了这个方法要响应的消息;
用消息处理方法来响应Windows的消息,这样就不用直接来调用它;
    override 表示是覆盖方法;要求祖先类中必须有该方法的定义,并且参数的顺序和类型
及返值的类型必须匹配;用于扩展祖先类中的该方法而不是取代它(如不调用祖先类中的该方
法则等同于取代);
    overload 表示是重载方法;用于一个类中有许多同名的方法带着不同的参数表的情形;
(属性的读写方法不能被重载);
    abstract 表示是抽象方法;是没有实现的方法,并且必须是virtual或dynamic方法,即
在abstract前面必须有virtual或dynamic关键字,其实现部分在派生类中;如
      procedure DoSomething; virtual; abstract;
    reintroduce表示是重新声明的方法;用于方法的名称与祖先类中的某个方法名称相同的情形;

5.virtual 和 dynamic定义的虚函数,都是为了子类override用的,
只不过它们的实现不一样
vitrual 占用的空间大点,但速度快些。dynamci正好相反.

stdcall是一种调用方式,标明了参数入stack的顺序和清除的方式,具体可看
Delphi的帮助. 

<think>嗯,用户问的是overrideoverload,这两个概念在编程里经常提到,尤其是面向对象的部分。先得确认自己理解正确,然后组织语言用中文解释清楚。 首先,override,也就是重写。记得这是子类覆盖父类的方法方法名、参数列表返回类型都得相同。目的是改变方法的行为,符合子类的需求。比如动物类的speak()方法,子类狗可能重写为“汪汪”。这时候应该用@Override注解,确保正确覆盖,避免错误。 然后是overload,重载。同一个类里,方法名相同但参数列表不同(类型、个数、顺序)。返回类型可以不同,但仅返回类型不同不算重载。比如一个add(int, int)add(double, double),根据传入参数类型决定调用哪个。这提高了方法的灵活性。 用户可能需要区分两者的区别,或者在实际编程中应用时遇到的疑惑。比如为什么覆盖要有相同的参数,而重载要不同。要举例说明,让概念更清晰。还要注意语法上的区别,比如@Override注解的使用,以及重载不关心返回类型等。 可能用户是刚开始学Java或者类似的OOP语言,需要明确这两个概念的区别应用场景。要确保解释准确,避免混淆。另外,是否需要提到多态?override是实现运行时多态,而overload是编译时多态?这样能更深入一点,帮助理解。 检查是否有遗漏,比如构造方法的重载,或者是否可以在不同访问权限下重写方法。不过可能用户只需要基础区别,暂时不需要深入细节。保持回答简洁明了,结构清晰,分点说明,再给出对比表格,帮助记忆。</think>在面向对象编程中,`override`(重写)`overload`(重载)是两个重要概念,它们的区别用法如下: --- ### 一、Override(重写) 1. **定义** 子类重新定义父类中**同名、同参数、同返回类型**的方法,用于修改或扩展父类方法的行为。 2. **特点** - **继承关系**:必须存在于父类与子类之间 - **方法签名严格一致**:方法名、参数列表、返回类型完全匹配 - **访问权限不能更严格**:子类方法的访问修饰符范围 ≥ 父类方法(例如父类是`protected`,子类可以是`public`,但不能是`private`) - **使用`@Override`注解**(Java等语言中):显式声明重写,编译器会检查是否符合规则 3. **示例** ```java class Animal { public void speak() { System.out.println("动物发声"); } } class Dog extends Animal { @Override // 明确标记为重写 public void speak() { System.out.println("汪汪"); } } ``` --- ### 二、Overload(重载) 1. **定义** 在同一个类中定义多个**同名但参数列表不同**的方法,根据传入参数类型或数量决定调用哪个方法。 2. **特点** - **参数差异**:通过参数类型、数量或顺序区分 - **返回类型可不同**:仅返回类型不同不足以构成重载 - **不依赖继承**:所有重载方法在同一类中 3. **示例** ```java class Calculator { // 重载方法1:两个整数相加 public int add(int a, int b) { return a + b; } // 重载方法2:两个浮点数相加 public double add(double a, double b) { return a + b; } // 重载方法3:三个整数相加 public int add(int a, int b, int c) { return a + b + c; } } ``` --- ### 三、对比表格 | **特性** | Override(重写) | Overload(重载) | |------------------|----------------------------------|-----------------------------------| | 作用范围 | 跨类(父类与子类) | 同一类内 | | 方法签名 | 必须完全相同 | 必须不同(参数类型、数量或顺序) | | 返回类型 | 必须相同 | 可以不同 | | 多态性 | 运行时多态(动态绑定) | 编译时多态(静态绑定) | | 访问权限 | 子类方法不能更严格 | 无限制 | | 抛出异常 | 子类方法异常范围 ≤ 父类方法 | 无限制 | --- ### 四、关键区别总结 1. **目的不同** - `Override`:实现多态,子类自定义父类方法的行为 - `Overload`:提供同一功能的多种调用方式 2. **绑定时机** - `Override`在运行时根据对象类型决定调用(动态绑定) - `Overload`在编译时根据参数类型决定调用(静态绑定) 3. **应用场景** - 重写常见于继承体系中对父类方法扩展 - 重载用于简化API设计(例如不同参数类型的`println()`方法) 通过理解这两个概念,可以更灵活地设计类的层次结构接口。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值