class Base{public:void f(){cout<<"void f()"<<endl<<endl;}void f(int i){cout<<"void f(int)"<<endl<<endl;}void h(){cout<<"void h()"<<endl<<endl;}void g(char s){cout<<"void g(char)"<<endl<<endl;}protected:private:}; class Devie1 : public Base{public:void h() // 重定義 覆蓋父類的h(){cout<<"Devie1 void h()"<<endl<<endl;} protected:private:}; class Devie2 : public Base{public:void f()// 重定義 覆蓋了父類的所有重載函數 f() f(int a){cout<<"Devie2 void f()"<<endl<<endl;}void g() // 隱藏 父類的 g(char s){cout<<"Devie2 void g()"<<endl<<endl;}protected:private:}; int _tmain(int argc, _TCHAR* argv[]){Base b;b.f();b.f(2);b.g('3');b.h(); Devie1 d1;d1.f(1);//繼承d1.f();//繼承d1.g('1');//繼承d1.h();//覆蓋 Devie2 d2;d2.f();//覆蓋 //找不到Base::f(int) 被隱藏 覆蓋父類的 f() d2.g();//隱藏//找不到父類的Base::g(char s) 被隱藏d2.h();//繼承//可以看出,若子類沒有重定義父類的操作,子類會調用父類的函數。//如果子類重定義,分兩種情況://1.子類重定義父類的函數,傳回值和參數列表一致,此為 覆蓋 override//子類和基類一樣可以發相同的訊息,但是子類表現出不同於父類的行為。。。。//2.子類重定義了父類的成員函數,但是修改了傳回值或者參數列表,此為隱藏 name hiding //子類重定義父類的重載函數 時 將導致該函數的所有版本在子類中被自動隱藏。。。//d1.f()先在子類找f() 找不到再到父類找,如果在子類找到了就使用了。。。 //替代原則:向上類型轉換//在任何需要基類對象(指標)的地方,都可以用子類的對象(指標)來代替 return 0;}//可以看出,若子類沒有重定義父類的操作,子類會調用父類的函數。//如果子類重定義,分兩種情況://1.子類重定義父類的函數,傳回值和參數列表一致,此為 覆蓋 override//子類和基類一樣可以發相同的訊息,但是子類表現出不同於父類的行為。。。。//2.子類重定義了父類的成員函數,但是修改了傳回值或者參數列表,此為隱藏 name hiding //子類重定義父類的重載函數 時 將導致該函數的所有版本在子類中被自動隱藏。。。//d1.f()先在子類找f() 找不到再到父類找,如果在子類找到了就使用了。。。 //替代原則:向上類型轉換//在任何需要基類對象(指標)的地方,都可以用子類的對象(指標)來代替