天天看点

C++中的重载、覆盖(重写)和隐藏

类中成员函数被重载的特征:

1、相同的作用域(同一个类中);

2、函数名字相同;

3、参数不同;

4、virtual关键字可有可无。

覆盖是指派生类函数覆盖基类函数,特征是:

1、不同的作用域(基类和派生类);

2、函数名字相同;

3、参数相同;

4、基类函数必须有virtual关键字。

隐藏指派生类函数屏蔽了与其同名的基类函数,特征是:

1、如果派生类的函数与基类的函数同名,但是参数不同,不论有无virtual关键字,基类的函数将被隐藏。(注意不能与重载混淆)

2、如果派生类的函数与基类的函数同名,参数也相同,基类函数没有virtual关键字,基类的函数将被隐藏。(注意不能与覆盖混淆)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class Base
{
public:
    virtual void test(float x)
    {
        cout << "Base::test(float) " << x << endl;
    }
    void test1(float x)
    {
        cout << "Base::test1(float) " << x << endl;
    }
    void test2(float x)
    {
        cout << "Base::test2(float) " << x << endl;
    }
    // 函数Base::test2(int)重载了Base::test2(float),函数名相同,参数不同,在同一个类中(同一作用域),故为重载
    void test2(int x)
    {
        cout << "Base::test2(int)" << x << endl;
    }
};
class Derived :public Base
{
public:
    // 函数Derived::test(float)覆盖了Base::test(float),函数名相同,参数相同,且有virtual关键字,故为覆盖
    virtual void test(float x)
    {
        cout << "Derived::test(float) " << x << endl;
    }
    //函数Derived::test1(float)隐藏了Base::test1(float),函数名相同,参数相同,但没有virtual关键字,故为隐藏,而不是覆盖
    void test1(float x)
    {
        cout << "Derived::test(float) " << x << endl;
    }
    //函数Derived::test2(int)隐藏了Base::test2(float),函数名相同,参数不同,但没有在同一个类中(同一作用域),故为隐藏,而不是重载
    void test2(int x)
    {
        cout << "Derived::test(int) " << x << endl;
    }
};
void Funtest()
{ 
    Derived d;
    Base *pb = &d;
    Derived *pd = &d;
    /*pb->test(1.02f);
    pd->test(1.02f);*/
    /*pb->test1(1.02f);
    pd->test1(1.02f);*/
    /*pb->test2(1.02f);
    pd->test2(3);*/
    pb->test2();
    pb->test2();
}
int main()
{
    Funtest();
    system("pause");
    return ;
}
           

函数Derived::test(float)覆盖了Base::test(float),运行结果如下:

C++中的重载、覆盖(重写)和隐藏

函数Derived::test1(float)隐藏了Base::test1(float),运行结果如下:

C++中的重载、覆盖(重写)和隐藏

函数Derived::test2(int)隐藏了Base::test2(float),运行结果如下:

C++中的重载、覆盖(重写)和隐藏

函数Base::test2(int)重载了Base::test2(float),运行结果如下:

C++中的重载、覆盖(重写)和隐藏