c++用虛函數、虛指針、虛表的手段來實現多態,其中虛函數需要程序員手動書寫,虛指針和虛表由構造對象的時候在內存中生成。
下圖為對象多態模型:
有A、B、C三個對象,關系為B繼承A、C繼承B,并且每個類中有虛函數和非虛函數。
(1)生成對象時如果類中有虛函數,則會在內存中生成一個虛指針,指向一個虛函數表;
(2)如果父類有虛函數,子類對象繼承父類的虛指針,對象中虛指針只有一個;
(3)子類繼承父類所有虛函數和非虛函數;
(4)虛指針指向所有父類和子類的虛函數組成的函數指針數組,如果子類中存在與父類相同的虛函數(子類函數不一定要加virtual),則在虛函數表中替換為子類的函數;
(5)用父類的指針指向子類的對象實現多態,如:A *pBase = new B;
關于隱藏和覆蓋(重寫)
子類和父類有相同的函數,但是父類不是虛函數,也就是該函數不在虛函數表中,這種形態叫做隱藏,父類指針調用之類對象函數時調用的是父類函數;
覆蓋就是實現多態模型;
新聞熱點
疑難解答
圖片精選