c++面向對象總結
- 什么是面向對象?面向對象的三大特性
- 重寫和重載的區別
- 隱藏和重寫,重載的區別
- 什么是多態?多態如何實現
什么是面向對象?面向對象的三大特性
面向對象:對象是指具體的某一個事物,這些事物的抽象就是類,類中包含數據(成員變量)和動作(成員方法)。
面向對象的三大特性:
- 封裝:將具體的實現過程和數據封裝成一個函數,只能通過接口進行訪問,降低耦合性。
- 繼承:子類繼承父類的特征和行為,子類有父類的非 private 方法或成員變量,子類可以對父類的方法進行重寫,增強了類之間的耦合性,但是當父類中的成員變量、成員函數或者類本身被 final 關鍵字修飾時,修飾的類不能繼承,修飾的成員不能重寫或修改。
- 多態:多態就是不同繼承類的對象,對同一消息做出不同的響應,基類的指針指向或綁定到派生類的對象,使得基類指針呈現不同的表現方式。
重寫和重載的區別
范圍區別:對于類中函數的重載或者重寫而言,重載發生在同一個類的內部,重寫發生在不同的類之間(子類和父類之間)。
參數區別:重載的函數需要與原函數有相同的函數名、不同的參數列表,不關注函數的返回值類型;重寫的函數的函數名、參數列表和返回值類型都需要和原函數相同,父類中被重寫的函數需要有 virtual 修飾。
virtual 關鍵字:重寫的函數基類中必須有 virtual關鍵字的修飾,重載的函數可以有 virtual 關鍵字的修飾也可以沒有。
隱藏和重寫,重載的區別
范圍區別:隱藏與重載范圍不同,隱藏發生在不同類中。
參數區別:隱藏函數和被隱藏函數參數列表可以相同,也可以不同,但函數名一定相同;當參數不同時,無論基類中的函數是否被 virtual 修飾,基類函數都是被隱藏,而不是重寫。
什么是多態?多態如何實現
多態:多態就是不同繼承類的對象,對同一消息做出不同的響應,基類的指針指向或綁定到派生類的對象,使得基類指針呈現不同的表現方式。在基類的函數前加上 virtual 關鍵字,在派生類中重寫該函數,運行時將會根據對象的實際類型來調用相應的函數。如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類,就調用基類的函數。
實現方法:多態是通過虛函數實現的,虛函數的地址保存在虛函數表中,虛函數表的地址保存在含有虛函數的類的實例對象的內存空間中。
實現過程:在類中用 virtual 關鍵字聲明的函數叫做虛函數;
存在虛函數的類都有一個虛函數表,當創建一個該類的對象時,該對象有一個指向虛函數表的虛表指針(虛函數表和類對應的,虛表指針是和對象對應);
當基類指針指向派生類對象,基類指針調用虛函數時,基類指針指向派生類的虛表指針,由于該虛表指針指向派生類虛函數表,通過遍歷虛表,尋找相應的虛函數。