C++ 中的函数覆盖 [函数重载与示例覆盖]

已发表: 2021-05-25

C++ 中的函数覆盖是一个功能,它允许我们在子类中使用已经存在于其父类中的函数。 子类继承所有数据成员,以及父类中存在的成员函数。 如果您希望覆盖子类中的任何功能,则可以实现函数覆盖。 函数覆盖意味着在子类中创建父类函数的更新版本。

目录

C++ 函数

C++ 函数是一组组合在一起执行任务的语句。 每个程序至少有一个 main() 函数,某些程序可以有附加函数。

函数声明向编译器传达函数名称、参数和返回类型。 函数定义决定了函数体。 C++ 标准库由程序可以调用的许多内置函数组成。 函数可以是方法、过程或子例程。

定义函数

C++ 函数的一般语法是:

return_type function_name(参数列表) {

功能体

}

任何 C++ 函数都包含函数头和函数体。 C++ 函数的组成部分是:

返回类型——返回类型表示函数返回值的类型。

函数名称 -这表示函数的名称。 函数名和参数列表组成了函数签名。

参数 –参数是函数返回值的占位符。 调用函数时,会将一个值传递给称为实际参数的参数。

函数体- 函数体构成了定义函数将做什么的语句列表。

调用函数

要在 C++ 中使用函数,您必须调用或调用该函数。 控制权转移给函数,然后函数执行所需的任务,return 语句将控制权返回给主程序。

您需要传递所需的参数,包括函数名来调用函数。 如果函数返回一个值,则可以存储该值。 有几种方法可以在调用函数时将参数传递给函数。 调用类型为按值调用、按引用调用和按指针调用。

C++ 中的函数覆盖

当派生类或子类定义了已在基类或父类中定义的函数时,在 C++ 中称为函数覆盖。 函数覆盖帮助我们实现运行时多态性。 它使程序员能够执行已在基类中使用的函数的特定实现。

例子:

资源

研究上面给出的例子。 这里父类是“Base”,子类是“Derived”。

上述程序的输出将是:

派生函数

在基类和派生类中都声明了函数 print()。 当我们通过派生类对象“派生1”调用函数 print() 时,派生类的 print() 被调用并通过覆盖基类的相同函数来执行。

功能覆盖原则的工作

资源

从上图中可以看出,Base 类函数被覆盖,因为我们通过 Derived 类的对象调用了相同的函数。

如果我们通过 Base 类的对象调用 print() 函数,该函数不会被覆盖。 例如:

//调用Base类的函数

基地基地1;

base1.print(); // 输出:基本函数

上述代码的输出将是:

基本功能

如何在 C++ 中访问被覆盖的函数

您必须使用范围解析运算符“::”来访问被覆盖的函数。 访问重写函数的另一种方法是使用基类的指针指向派生类的对象并通过指针调用函数。

例子:

资源

上述程序的输出将是:

派生函数

基本功能

覆盖函数访问的工作

资源

这里的语句 derived 1.print() 访问 Derived 类的 print() 函数,而语句 derived2.Base::print() 访问 Base 类的 print() 函数。

从派生类调用 C++ 重写函数

在这段代码中,我们从 Derived 类本身中调用被覆盖的函数。

来自 Derived 类的重写函数调用的工作

资源

Base::print() 命令从 Derived 类内部调用被覆盖的函数。

从世界顶级大学在线学习软件工程课程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

函数重载与函数覆盖

函数重载是在编译时实现的,可以在基类和派生类中完成。 它有助于通过更改函数的签名(例如参数的数据类型或返回类型)来提供函数的多种定义。

函数覆盖是在运行时实现的。 在覆盖中,基类在派生类中重新定义,具有相同的返回类型和参数。 C++ 中函数覆盖和函数重载之间的其他区别是:

1. 继承

函数重写只能与类继承一起使用,而函数重载不需要类继承。

2. 函数签名

重载函数的签名在参数数量或参数类型上有所不同。 在函数覆盖中,函数签名保持不变。

三、功能范围

重载函数的作用域不同,而重载函数的作用域相同。

4. 函数行为

当派生类函数的执行方式必须与基类函数不同或具有附加功能时,函数覆盖是必不可少的。 当具有相同名称的函数需要根据传递给它们的参数具有不同的行为时,就会实现函数重载。

如果您有兴趣了解有关全栈软件开发的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发执行 PG 计划,该计划专为在职专业人士设计,提供 500 多个小时的严格培训、9 个以上的项目,和任务、IIIT-B 校友身份、实用的实践顶点项目和顶级公司的工作协助。

什么是函数覆盖?

函数覆盖是面向对象编程中的一个概念,它允许派生类中的函数覆盖其基类中的函数,但具有不同的签名(并且通常具有不同的实现)。 这方面的一个关键方面是派生类不可能“撤消”对基类的更改,或者至少在不进一步编辑基类的情况下是不可能的。 函数覆盖的一个常见用途是在基类中提供默认实现,然后在派生类中使用特定实现进行覆盖。

函数重载和重载有什么区别?

当您创建与基类中已存在的函数同名的函数时,会发生函数覆盖。 发生这种情况时,新功能将替换现有功能,并可以代替原来的功能使用。 当您创建具有相同名称但参数不同的函数时,会发生重载。 发生这种情况时,除了原始函数之外,还将调用新函数,并且这两个函数都可以在任何上下文中使用而没有任何问题。

C++中的继承是什么?