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() 找不到再到父類找,如果在子類找到了就使用了。。。
//替代原則:向上類型轉換
//在任何需要基類對象(指針)的地方,都可以用子類的對象(指針)來代替