覆盖和重写

重载(OverLoading

重载的函数出现在相同的作用域中,具有相同的名字,不同的形参列表。一般用于在一个类中实现若干个方法,这些方法的名字相同而参数的形式不同。

规则:

1.只能通过相同的方法名、不同的形参来实现。不同的形参指的是参数的类型、个数和顺序(有多个不同类型的参数,以不同的顺序出现)的不同。

2.不能基于不同的返回类型、访问权限和抛出的异常实现重载。

3.方法抛出的异常类型和数目不会对重载构成影响。

覆盖(OverRiding)=重写

覆盖(重写)一般出现在类的继承中,在派生的子类重新实现父类的方法。

规则:

1.       重写的方法必须与被重写的方法有完全相同的参数列表,否则编译器会将其视为重载。

2.       重写方法的访问权限必须大于或等于(只在基类访问权限为public时)被重写方法的访问权限。(public>protected>private)。

3.       重写的方法必须与被重写的方法有相同的返回值。

4.       重写的方法所抛出的异常必须与被重写的方法所抛出的异常一致,或是其子类。

5.       被重写的方法不能为private,否则认为子类只是新定义了一个方法,而不是进行重写。

6.       静态的方法不能被重写为非静态的方法。

C++中,基类的函数没有virtual关键字时,称为重写,有virtual关键字时称为覆盖。

# 题目重述 “方法覆盖“方法重写”这两个术语在面向对象编程中经常被提及,它们在很多语境下是**同义词**,但在严格意义上是否有区别?请说明其在不同语境下的使用含义。 # 详解 ## 一、方法覆盖(Method Overriding)方法重写(Method Overriding) > **严格来说,"方法覆盖" "方法重写" 是同一个概念,英文均为 Method Overriding。** > 在中文翻译使用过程中,由于不同教材、书籍或开发者的习惯,出现了两个不同的中文术语。 --- ### ✅ 方法覆盖/重写的定义: 在**面向对象编程中**,当子类重新定义从父类继承而来的方法时,就称为**方法覆盖**或**方法重写**。重写的方法具有相同的: - 方法名 - 返回类型(C++中可以协变返回类型) - 参数列表 - 访问权限不能比父类更严格(Java等语言有明确规定) > 子类通过重写方法,可以实现**多态行为**,即运行时根据对象的实际类型调用相应的方法。 --- ### ✅ 示例(Java) ```java class Animal { public void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark"); } } ``` 在运行时,若调用 `Animal a = new Dog(); a.makeSound();`,会执行 `Dog` 类的 `makeSound()` 方法,这就是**多态**的体现。 --- ### ✅ 示例(C++) ```cpp #include <iostream> using namespace std; class Base { public: virtual void show() { cout << "Base show" << endl; } }; class Derived : public Base { public: void show() override { cout << "Derived show" << endl; } }; ``` C++中需要使用 `virtual` 关键字将方法设为虚函数,才支持运行时多态。 --- ## 二、方法重载(Overloading) vs 方法重写(Overriding) | 对比项 | 方法重载(Overloading) | 方法重写(Overriding) | |------------------|------------------------------------------------|----------------------------------------------------| | **位置** | 同一个类中 | 父类子类之间 | | **方法名** | 相同 | 相同 | | **参数列表** | 必须不同(类型、个数、顺序) | 必须相同 | | **返回类型** | 可以不同(仅靠返回类型不同不能重载) | 必须相同或协变(如C++允许协变) | | **访问权限** | 无限制 | 子类不能比父类更严格(Java限制) | | **绑定机制** | 编译时多态(静态绑定) | 运行时多态(动态绑定) | | **是否需要关键字**| 不需要 | Java 中可用 `@Override` 检查是否正确重写 | | **是否允许 final**| 允许 | final 方法不能被重写 | --- ### ✅ 总结:区别在于语境 | 术语 | 英文术语 | 含义说明 | 是否为同一概念 | |------------|--------------|------------------------------------|----------------| | 方法覆盖 | Method Overriding | 子类重新实现父类的方法 | ✅ 是同一概念 | | 方法重写 | Method Overriding | 子类覆盖父类的行为,实现多态 | ✅ 是同一概念 | | 方法重载 | Method Overloading | 同一类中方法名相同但参数不同 | ❌ 不是重写 | --- # 知识点(列出该答案中涉及的知识点) - **方法重写(Overriding)**:子类重新定义父类的方法,实现运行时多态,要求方法签名相同。 - **方法重载(Overloading)**:在同一个类中方法名相同但参数不同,属于编译时多态。 - **虚函数机制(C++)**:通过虚函数表实现运行时多态,子类重写父类虚函数以改变行为。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值