函數重載:
1 必須在同一個類中進行
2 子類無法重載父類的函數,父類同名函數將被名稱覆蓋
3 重載是在編譯期間根據參數類型和個數決定函數調用
函數重寫:
1 必須發生在子類與父類之間
2 並且父類與子類中的函數必須有完全相同的原型
3 使用virtual聲明之後能夠產生多態(如果不使用virtual,)
class Parent
{
public:
virtual void func()
{
cout << "func() do... " << endl;
}
virtual void func(int i)
{
cout << "func(int i) do ..." << i << endl;
}
virtual void func(int i, int j)
{
cout << "func(int i, int j) do...." << i << ", " << j << endl;
}
};
上面這個Parent類的三個func() 方法在Parent類中就是重載
class Child :public Parent
{
public:
virtual void func(int i, int j)
{
cout << "func(int i, int j) do...." << i << ", " << j << endl;
}
virtual void func(int i, int j, int k)
{
cout << "func(int i, int j) do...." << i << ", " << j << ", " << k <<endl;
}
};
上面的Child類中的兩個func() 方法在Child類中也是重載
並且子類Child跟父類Parnet中都有一個函數func(int i, int j) 函數參數是兩個,那麼這個函數就是子類重寫父類的函數,
int main()
{
Child c1;
// c++ 編譯器看到子類中已經存在了,就不會去父類中找,所以C++編譯器會報錯
// c1.func(); // 這句代碼是有錯誤的
// c1.abc(2); // 不會報錯
// c1.abc() // 這個函數是會被覆蓋掉的
// 如果需要調用父類的abc() 函數 那麼就需要顯示地調用父類的同名方法
c1.Parent::abc(); // 加上域作用符號顯示調用
system("pause");
return 0;
}