看板 C_Sharp 關於我們 聯絡資訊
※ 引述《AJE (小傑)》之銘言: : 想請問有關繼承與覆寫虛擬函數的問題 : 以下是我寫的測試程式: (略) : //Class宣告-------------------------------------- : //主程式 : Child Val = new Child(); : MessageBox.Show(Convert.ToString(Val.CalcVal())); : 因為CalcVal是父類別的函式,而父類別也有自己的Data()函式, : 所以我本來以為輸出的值是10,但是實際輸出的結果是200, : 我想請問: : 1.是不是只要被覆寫之後,父類別中呼叫被覆寫的函式時,實際上會 : 呼叫到子類別中的函式? 應該說如果呼叫一個標記為virtual的函式時 會看呼叫那個函式的物件實際的類別是哪一個 如果該類別有override的版本則呼叫該類別的版本 以你的測試程式為例 // 實際物件是Child,結果是200 Father Val = new Child(); MessageBox.Show(Val.CalcVal().ToString()); // 實際物件是Father,結果是10 Father Val = new Father(); MessageBox.Show(Val.CalcVal().ToString()); : 2.如果是的話,那麼在父類別中的任何函式,實作上是否最好不要呼叫 : 任何一個"虛擬"函式,以免未預期的行為發生? 要看你預期的行為到底是什麼 如果你不希望一個函式被繼承之後可能會被改掉 就不應該標記成virtual : 3.在這個例子中,如果我希望輸出10,且又希望兩個類別保有Data()函式的話, : 是不是最好用獨立的兩個類別來處理,不要用"繼承"的方式? 你可以不要用virtual-override的方式 Child類別裡用 new public int Data() Father類別的Data()就不會被改掉 而是在以Child類別的reference存取時會被隱藏 但用Father類別的reference呼叫或是在Father中呼叫都會取Father版的Data() : 先謝謝版友了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.194.108 ※ 編輯: ssccg 來自: 58.114.194.108 (11/24 11:30)
AJE:感謝 又學了一些 11/24 18:00