类中成员函数被重载的特征:
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),运行结果如下: