函數(shù)重載
必須在同一個類中進(jìn)行
子類無法重載父類的函數(shù),父類同名函數(shù)將被名稱覆蓋
重載是在編譯期間根據(jù)參數(shù)類型和個數(shù)決定函數(shù)調(diào)用
函數(shù)重寫
必須發(fā)生于父類與子類之間
并且父類與子類中的函數(shù)必須有完全相同的原型
使用virtual聲明之后能夠產(chǎn)生多態(tài)(如果不使用virtual,那叫重定義)
多態(tài)是在運(yùn)行期間根據(jù)具體對象的類型決定函數(shù)調(diào)用
[cpp]
view plain copyclass Parent01
{
public:
Parent01()
{
cout<<"Parent01:printf()..do"<<endl;
}
public:
void func()
{
cout<<"Parent01:void func()"<<endl;
}
void abcd()
{
cout<<"Parent01:void func()"<<endl;
}
virtual void func(int i)
{
cout<<"Parent:void func(int i)"<<endl;
}
virtual void func(int i, int j)
{
cout<<"Parent:void func(int i, int j)"<<endl;
}
};
Parent01類中的四個func函數(shù)是函數(shù)重載。
定義一個子類:
[cpp]
view plain copyclass Child01 : public Parent01
{
public:
//發(fā)生了名稱覆蓋,把父類中的沒有函數(shù)參數(shù)的,這個函數(shù)abcd名稱覆蓋了。
//在子類中,是不能重載父類的函數(shù)的。編譯器就是這么做的,順從。。。。
void abcd(int a, int b)
{
cout<<"Parent01:void func()"<<endl;
}
//此處2個參數(shù),和父類func函數(shù)是函數(shù)重寫的關(guān)系,如果將父類中的virtual關(guān)鍵字去掉,此處就是函數(shù)重定義。
void func(int i, int j)
{
cout<<"Child:void func(int i, int j)"<<" "<<i + j<<endl;
}
//此處3個參數(shù)的,和父類func函數(shù)沒有關(guān)系,在本類中發(fā)生了函數(shù)重載。
void func(int i, int j, int k)
{
cout<<"Child:void func(int i, int j, int k)"<<" "<<i + j + k<<endl;
}
};