推 AJE:感謝 又學了一些 11/24 18:00
※ 引述《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)