函式過載重寫重定義
阿新 • • 發佈:2019-02-18
一.首先問題的引出
看如下程式碼,方便分析說明給函式編號
這樣看的話會有點蒙圈,那簡單的看下面這個示意圖class parent { public: //1.virtual void fun() { cout << "parent->fun()..." << endl; } //2.virtual void fun(int i) { cout << "parent->fun(int i) " << i << endl; } //3.virtual void fun(int i, int j) { cout << "parent->fun(int i,int j) " << i << j << endl; } }; class child:public parent { public: //4.virtual void fun(int i, int j) { cout << "child->fun(int i,int j) " << i << j << endl; } //5.virtual void fun(int i, int j, int k) { cout << "child->fun(int i,int j,int k)" << endl; } }; int main() { child c1; c1.fun(); system("pause"); return 0; }
有幾個問題:
1.為什麼會出現這個錯誤?
2.子類中的fun函式和父類中的fun函式是什麼關係?
下面經過上面 的例子後我們看看真正的概念
二.函式過載與函式重寫
1.函式過載:必須在同一個類中進行 子類無法過載父類函式 父類同名函式將被名稱覆蓋 過載是在編譯器期間根據函式引數型別和個數決定函式的呼叫 2.函式重寫:1.必須發生在父類與子類之間 2.並且父類和子類中的函式有完全相同的原型 3.使用virtual關鍵字宣告之後能夠產生多型(如果不使用virtual的重寫,那叫重定義) 4.多型是在執行期間根據具體物件的型別決定函式呼叫 通過對上述概念的理解,我們來看上述程式碼的問題 ①1,2,3為函式過載;4,5為過載函式 ②3,4為函式重寫 ③如果去掉virtual關鍵字,3,4就是非虛擬函式重寫,即重定義 現在看發生剛才錯誤的原因: 子類無法過載父類函式, 父類同名函式將被名稱覆蓋。 因為父類中的fun被子類中的fun覆蓋,佔用了父類fun函式的位置,編譯器開始在子類中找fun()無參函式,沒有找到,所以出現錯誤。 那麼怎麼解決呢? 加上域作用符就好了。int main() { child c1; c1.parent::fun(); system("pause"); return 0; }