C++中 overload、redefine 和 override的含义和区别

Overloading Functions

CONCEPT

Overloading function (重载函数):在C++中,两个或者两个以上的函数可以有完全相同的函数名,只要它们的参数列表不同,程序就能区分出被调用的函数是哪一个。这种情况就叫做重载函数。

更通俗的讲,C++通过函数签名来区分不同的函数。函数签名就像函数的ID一样。只要函数签名有区别,即便几个函数拥有一样的名字,C++也能分辨它们。

函数签名

在同一个命名空间内,C++的函数签名(function signature)包括:函数名、参数个数、参数类型、参数顺序

函数签名并不包含返回值的类型。如果两个函数仅仅返回值类型不同,C++将无法区别它们,编译的时候会报错,如下:

int sumValues(double val1, double val2)
{
   
    return val1 + val2;
}

double sumValues(double val1, double val2)
{
   
    return val1 + val2;
}

overload.cpp: In function ‘double sumValues(double, double)’:
overload.cpp:29:8: error: ambiguating new declaration of ‘double sumValues(double, double)’
double sumValues(double val1, double val2)
^~~~~~~~~
overload.cpp:24:5: note: old declaration ‘int sumValues(double, double)’
int sumValues(double val1, double val2)
^~~~~~~~~

函数参数列表不同(参数个数、参数类型、参数顺序三者),例如:

double calcWeeklyPay(int, double);
double calcWeeklyPay(double);

Redefining functions

CONCEPT

Redefining Base Class Function (重定义基类中的函数):当派生类中有与基类同名的函数,即为重定义。但是基类派生类中的这两个同名函数的参数列表不一定要不同,可以相同。因为派生类的对象将调用派生类中的此重定义函数,基类的对象将调用基类中的此函数,编译器不用通过参数列表的不同来区分到底要调用哪个函数,而是通过调用的此函数的对象的类别来决定调用基类还是子类中的重定义函数。

Redefine Example

基类为 GradedActivity,子类为 PassFailActivity。子类 PassFailActivity 重定义了基类中的 getLetterGrade() 函数。
基类的 getLetterGrade() 根据所获得的分数返回对应的 “A”、“B”、“C” 等级。
子类的 getLetterGrade() 判断分数是否通过及格线,通过返回 “P” 表示 pass, 没有通过返回 “F” 表示 fail。

GradedActivity.h:

#pragma once

class GradedActivity
{
   
protected:
    double score;

public:
    GradedActivity() {
    score = 0.0; }
    GradedActivity(double s) {
    score = s; }
    void setScore(double s) {
    score = s; }
    double getScore() const {
    return score; }
    char getLetterGrade() const;
};

PassFailActivity.h:

#pragma once
#include "GradedActivity.h"

class PassFailActivity : public GradedActivity
{
   
protected:
    double minPassingScore;
public:
    PassFailActivity() : GradedActivity() {
    minPassingScore = 0.0; }
    PassFailActivity(double mps) : GradedActivity() {
    minPassingScore = mps; }
    void setMinPassingScore(double mps) {
    minPassingScore = mps; }
    double getMinPassingScore() const {
   return minPassingScore; }
    char getLetterGrade() const
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
override和overloadC++的两个重要概念,它们都与函数相关。 override表示重写父类的虚函数,子类的该虚函数必须与父类的虚函数具有相同的名称、参数列表、返回类型和const属性。override关键字可以增加代码的可读性和可维护性,避免了由于不小心修改函数签名而导致的错误。 overload表示函数重载,即在同一作用域内定义多个名称相同但参数列表不同的函数。函数重载可以让程序员更方便地编写代码,减少函数名称的冲突,提高代码的可重用性。 下面是一个使用override和overload的示例代码: ```c++ #include <iostream> using namespace std; class Animal { public: virtual void say() const { cout << "I'm an animal." << endl; } }; class Cat : public Animal { public: void say() const override { cout << "I'm a cat." << endl; } }; void print(int num) { cout << "This is an integer: " << num << endl; } void print(double num) { cout << "This is a double: " << num << endl; } int main() { Animal* animal = new Cat(); animal->say(); //输出"I'm a cat." print(10); //输出"This is an integer: 10" print(3.14); //输出"This is a double: 3.14" return 0; } ``` 在上面的代码,Cat类继承自Animal类,并重写了say()虚函数,使用override关键字标注。另外,print()函数定义了两个重载版本,一个接受int类型参数,另一个接受double类型参数,这样在main函数可以根据不同类型的参数调用不同版本的print()函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值