(1)概述
如果要隱藏函式,要使用new關鍵字;如果要重寫(覆蓋)虛函式,要使用virtual和override關鍵字。
然後講一下什麼是申明類和例項類。舉個例子: bird b = new magpie();
bird類就是申明類,而magpie就是例項類。
接下來講一下呼叫某個物件的函式的基本規律。該方法可以結合以下幾節的例項具體運用。
1、當呼叫乙個物件的函式時,系統會直接去檢查這個物件的申明類,看所呼叫的函式是否為虛函式;
2、如果不是虛函式,那麼它就直接執行該函式。而如果有virtual關鍵字,也就是乙個虛函式,那麼這個時候它就不會立刻執行該函式了,而是轉去檢查物件的例項類。
3、在這個例項類裡,他會檢查這個例項類的定義中是否有重新實現該虛函式(通過override關鍵字),如果是有,那麼ok,它就不會再找了,而馬上執行該例項類中的這個重新實現的函式。而如果沒有的話,系統就會不停地往上找例項類的父類,並對父類重複剛才在例項類裡的檢查,直到找到第乙個重寫了該虛函式的父類為止,然後執行該父類裡重寫後的函式。
該規律節選自
(2)隱藏函式:
class program
}class bird
}class magpie : bird
}
如果想在magpie類中定義自己的chirp()方法,也就是說隱藏基類中的同樣簽名的方法,就需要在派生類中定義相同簽名的方法。
但是這樣編譯器會出現乙個警告,提示如果有意去隱藏基類的方法,請使用new關鍵字修飾。
warning 1 'inheritancetest.magpie.chirp()' hides inherited member 'inheritancetest.bird.chirp()'. use the new keyword if hiding was intended.
所以正確的做法是
class magpie : bird
}
如果執行該程式,結合概述中的規律,在呼叫物件的方法時,檢視申明類的方法的宣告,如果不是虛函式,則直接執行申明類中的方法。
所以在上面那個例子中,輸出結果為
magpie ...
...只有第二次呼叫的時候使用的是magpie類作為申明類,所以只有第二次呼叫的是magpie.chirp()的方法
(3)虛函式
下面在bird.chirp()方法前加上virtual關鍵字,則該函式成為了虛函式。
class program
}class bird
}class magpie : bird
}
在以上的例子中,magpie類的定義方法會使編譯器發出警告,對magpie.chirp()方法或者使用new關鍵字,或者使用override關鍵字。
warning 1 'inheritancetest.magpie.chirp()' hides inherited member 'inheritancetest.bird.chirp()'. to make the current member override that implementation, add the override keyword. otherwise add the new keyword.
下面我們使用new關鍵字來隱藏父類中的方法,然後看看輸出結果是什麼。
class magpie : bird
}
執行程式,輸出結果為:
magpie ...
...道理同我們在概述中一樣。申明類為bird時,雖然chirp()是虛函式,但是子類中並沒有重寫該函式,所以最後還是執行了bird.chirp()的方法。申明類為magpie時,就直接執行了magpie.chirp()的方法。
如果我們要使用override關鍵字,就表示我們要對父類中的虛函式重寫或者覆蓋。
class magpie : bird
}
再執行程式,就會得到不同的結果:
magpie ...
magpie ...
具體原因請結合概述中的規律進行分析。
(4)下面做乙個練習
class program
}class animal
}class bird : animal
}class magpie : bird
class chicken : animal
}
輸出結果為:
animal move
bird move
bird move
animal move
chicken move
虛函式和純虛函式 覆蓋和隱藏
虛函式 virtual void breather cout annimal breather 從 中可以看出,虛函式有方法體。虛函式主要是c 的多型性,當編譯器編譯的時候,發現breather 是乙個虛函式,這時候c 就會才用遲繫結 late binding 技術。也就是編譯時不確定具體呼叫的函式...
虛函式與純虛函式
1 基本形式 virtual returntype function 1 虛函式宣告 virtual returntype function 2 0 純虛函式宣告 先講示例吧,再總結結論。2 示例 classanimail 這段 的輸出結果是什麼呢?起初我認為是 animail function 1...
虛函式與純虛函式
參考 虛函式 比如 virtual void function1 virtual關鍵字修飾的 成員函式 就是虛函式。把基類的成員函式 設為virtual,其 派生類的相應的函式也會自動變為虛函式。指向 基類的指標在操作它的 多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。純虛...