类中成员函数重载、隐藏、覆盖

重载:不一定非要发生在类中。同一作用域的同名函数,参数列表不同,都有可能是重载函数

运算符重载:同一运算符对不同类型对象的操作

函数重载:同一函数名,用不同类型的参数加以区分

类中成员函数的 重载、覆盖和隐藏

成员函数重载特征:

1)具有相同的作用域(即在同一个类的作用域中)

2)函数名字相同

3)参数列表不同,包括参数类型、顺序或数目

4)virtual关键字可有可无(不用考虑是否有virtual关键字)

覆盖是指派生类重新实现(或者改写了)基类的成员函数,其特征是:

1)不同的作用域(一个在派生类一个在基类)

2)基类函数必须是虚函数

3)函数名称,参数列表必须完全相同

隐藏是指派生类的成员函数遮蔽了与其同名的基类的同名函数,具体规则如下:

1)派生类成员函数与基类成员函数同名,但参数列表有所差异。此时,不论有误virtual,基类的成员函数在派生类中都被隐藏。

2)派生类成员函数与基类成员函数同名,参数列表也完全相同。此时基类的成员函数中没有virtual关键字,基类中的函数在派生类中被隐藏。

实例:

#include <iostream>
using namespace std;
class Base
{
public:
virtual void f(float x) {cout<<"Base::f(float)"<<x<<endl;}
void g(float x) {cout<<"Base::g(float)"<<x<<endl;}
void h(float x) {cout<<"Base::h(float)"<<x<<endl;}

};

class Derived : public Base
{
public:
virtual void f(float x) {cout<<"Derived::f(float)"<<x<<endl;}
void g(int x) {cout<<"Derived::g(float)"<<x<<endl;}
void h(float x) {cout<<"Derived::h(float)"<<x<<endl;}
};
int main()
{
Derived d;
Base* pb = &d;
Derived* pd = &d;
//virtual 动态绑定。程序的行为仅依赖于对象的真实类型
pb->f(3.14f);
pd->f(3.14f);

////隐藏规则1

pb->g(3.14f);
pd->g(3.14f);

////隐藏规则2

pb->h(3.14f);
pd->h(3.14f);

return 0;
}

博客内容只为本人学习所感转载亦或自写,不足或错误之处请大家不吝赐教
原文地址:https://www.cnblogs.com/niupan369/p/4487729.html