对于函数重载-函数覆盖-函数隐藏的区别

xiaoxiao2021-02-28  98

1 函数重载(在一个作用域下) 定义: 函数名相同,函数入参不同(1 函数入参的个数不同,2 数据类型不同 3 参数顺序),也就是面向对象程序设计的多态性的实现,就是指同一个函数名可以实现不同的功能。 补充 :const也可以成为函数重载的依据,如果同时在类中,对于函数名相同的const函数和非const也可以构成函数重载。何时被引用呢?如果定义的对象是常对象,则调用的是常成员函数,如果定义的是非常对象,则调用的是非常成员函数。 更多关于const函数重载的知识,可以看这篇博客,链接如下: http://blog.csdn.net/sun19910114/article/details/40051713 注意: 函数返回值无法实现函数重载,因为在调用函数的时候可以选择接收或者丢弃返回值,所以编译系统无法判断你是调用有返回值的函数然后丢弃返回值,还是调用没有返回值的 函数。所以 ,函数返回值无法实现函数重载。 判别函数重载的第一要素就是:函数名称。

#include <iostream> using namespace std; void fun(int a, int n) { cout << "hh" << endl; } void fun(int n,int a[]) //入参顺序 { cout << "gg" << endl; } void fun(int n) //入参个数 { cout << "ee" << endl; } void fun(char a) //入参类型 { cout << "aa" << endl; } //int fun(char a)//error int main() { int a = 8; char b='a'; fun(a); fun(b); return 0; }

2 函数覆盖 (重写,在不同的作用域下,分别位于派生类与基类) 函数重写:是指派生类重新定义基类的虚函数,函数名相同,参数相同,返回值相同,基类必须有virtual 关键字。

3 函数隐藏(也称重定义,同的作用域下,分别位于派生类与基类) 函数隐藏:函数名字相同,返回值可以不同; 参数不同,此时,无论有无 virtual 关键字,基类函数被隐藏 ; 参数相同,基类函数没有virtual关键字,基类函数被隐藏.

#include <iostream> using namespace std; class Base { public : virtual void fun() //A { cout << "gg" << endl; } int fun(int c) //B { cout << "c=" << c << endl; return c; } }; class Inherit :public Base { public: void fun() //C { cout << "ff" << endl; } int fun(int c) //D { cout << "dss" << endl; return c; } }; int main() { int c = 10; Inherit obj2; obj2.fun(10); obj2.Base::fun(10); obj2.fun(); return 0; } 在上面代码中,在派生类和基类中都各自重载了fun成员函数;

A和C是函数重写,B和D是函数隐藏,隐藏了基类的B。 写的不好,多多包涵。

转载请注明原文地址: https://www.6miu.com/read-24281.html

最新回复(0)