類中成員函數被重載的特征:
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),運作結果如下:

函數Derived::test1(float)隐藏了Base::test1(float),運作結果如下:
函數Derived::test2(int)隐藏了Base::test2(float),運作結果如下:
函數Base::test2(int)重載了Base::test2(float),運作結果如下: