函数的重载,重写,重定义
发布日期:2021-11-20 10:18:06 浏览次数:10 分类:技术文章

本文共 1809 字,大约阅读时间需要 6 分钟。

转载:

函数重载(overload)

函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:
(1)相同的范围(在同一个作用域中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);
(5)返回值可以不同;

函数重写(也称为覆盖 override)

函数重写是指子类重新定义基类的虚函数。特征是:

(1)不在同一个作用域(分别位于派生类与基类);

(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同,否则报错;
(6)重写函数的访问修饰符可以不同;

重载与覆盖的区别:

(1)覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中不同方法之间的关系,是水平关系;

(2)覆盖要求参数列表相同,重载要求参数列表不同;覆盖要求返回类型相同,重载则不要求;

(3)覆盖关系中,调用方法体是根据对象的类型(基类类型还是派生类类型)来决定的,重载关系是根据调用时的实参表与形参表来选择方法体的。

重定义(也称隐藏)

(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆);

(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆);

代码例子:

#include 
using namespace std; class Base{
public: void a() {
cout << "void Base::a()" << endl; } //重载了上面的void a()函数,发生在同一个类中 void a(int i) {
cout << "void Base::a(int i)" << endl; } virtual void b() {
cout << "virtual void Base::b()" << endl; } virtual void c() {
cout << "virtual void Base::c()" << endl; } virtual void d() {
cout << "virtual void Base::d()" << endl; }private: int x;};class Derived :public Base {
public: //在基类Base中,函数a不是虚函数,所以这里是重定义 void a() {
cout << "void Derived::a()" << endl; } //参数不同。此时,不论无论有无virtual 关键字,基类的函数将被隐藏,属于重定义 void b(float f) {
cout << "virtual void Derived::b(float f)" << endl; } /* //编译器报错,也就是说编译器认为函数名和参数都与基类的虚函数c相同,那么返回值也必须相同 //要么,你就别让编译期认为这是多态,也就是别和基类设置一样的函数名或参数,改变其一即可 float c() { cout << "virtual float Derived::c()" << endl; return 1.1; } */ //父类中定义了虚函数,子类与父类函数名字相同,参数相同,返回值相同,属于函数重写 void d() {
cout << "virtual void Derived::d()" << endl; }};int main(){
int i = 6; float f = 'a'; Base base; base.a(); base.a(i); base.b(); base.c(); base.d(); Derived derived; derived.a(); derived.b(f); derived.d(); system("pause"); return 0;}

转载地址:https://blog.csdn.net/weixin_43223362/article/details/105250574 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:二维数组求行数和列数以及vector容器中矩阵求行数和列数
下一篇:引用与取地址符的区别

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月26日 13时36分26秒