您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-20 18:56 183 查看
类中成员函数被重载的特征:

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(1.02f);
pb->test2(3);
}
int main()
{
Funtest();
system("pause");
return 0;
}


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



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



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



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息