1. 重載、覆蓋與隱藏
1).重載:成員函數具有以下的特徵時發生"重載"
A.相同的範圍(同一個類中)
B.函數的名字相同
C.參數類型不同(不能進行隱式類型轉換)
D.Virtual關鍵字可有可無
2).覆蓋(也叫"繼承"):指衍生類別函數覆蓋基類函數,特徵是:
A.不同的範圍(分別位於基類與衍生類別中)
B.函數名字相同
C.參數相同
D.基類函數必須有virtual關鍵字
3).隱藏:是指衍生類別的函數屏蔽了與其同名的基類函數,規則如下:
A.如果衍生類別的函數與基類的函數同名,但是參數不同,此時不論有無virtual關鍵字,基類的函數都將被隱藏,注意別與重載混淆)
B.如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字,此時基類的函數被隱藏(注意別與覆蓋混淆)
2.看下面這個例子代碼:
#include <iostream>
using std::cout;
using std::endl;
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl;}
void g(float x){ std::cout << "Base::g(float) " << x << std::endl;}
void h(float x){ std::cout << "Base::h(float) " << x <<std::endl;}
};
class Derived : public Base
{
public:
virtual void f(float x){ std::cout << "Derived::f(float) " << x << std::endl;}
void g(int x){ std::cout << "Derived::g(int) " << x << std::endl;}
void h(float x){ std::cout << "Derived::h(float) " << x << std::endl;}
};
void main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
pb->f(3.14f);//Derived::f(float) 3.14
pd->f(3.14f);//Derived::f(float) 3.14
pb->g(3.14f);//Base::g(float) 3.14
pd->g(3.14f);//Derived::g(int) 3
pb->h(3.14f);//Base:h(float) 3.14
pd->h(3.14f);//Derived::h(float) 3.14
}