C++中对多态的理解
生活随笔
收集整理的這篇文章主要介紹了
C++中对多态的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 多態:是指類中具有相似功能的不同函數,使用同一個名稱來實現;是對類的行為再抽象;多態是通過重載函數和虛函數來實現的。
2 繼承討論的是類與類的層次關系,多態則是考慮在不同層次的類中,以及在同一個類的內部,同名成員函數之間的關系問題,是解決功能和行為的再抽象問題。
3 多態是指類族中具有相似功能的不同函數使用同一個名稱來實現,從而可以使用相同的調用方式來調用這些具有不同功能的同名函數。
類型:
面向對象的多態性可以分為4類:
專用多態:
(1)重載多態:普通函數以及成員函數的重載。
(2)強制多態:將一個變量的類型加以變化。
通用多態:
(3)包含多態:研究類族中定義于不同類中的同名成員函數的多態行為,主要通過虛函數來實現。
(4)參數多態:與類模板相關聯。
實現:
多態從實現的角度可以分為:
(1)編譯時的多態:靜態聯編(重載、強制、參數),程序編譯連接階段完成。
(2)運行時的多態:動態聯編(包含),程序運行階段完成。
聯編:是指計算機程序自身彼此關聯的過程,就是把一條消息和一個對象的方法相結合的過程。
運算符重載:
運算符重載的實質是函數重載,在實現過程中,首先把指定的運算表達式轉化為對運算符函數的調用,運算對象轉化為運算符函數的形參,然后根據實參的類型來確定需要調用的函數,這個過程是在編譯過程中實現的。不能重載的運算符有5個:“.”,“*”,“::”,“? :”“sizeof”。
虛函數:
虛函數是動態聯編的基礎,虛函數是非靜態成員函數,虛函數經過派生之后,在類族中可以實現運行過程中的多態。
根據賦值兼容規則,可以使用派生類對象代替基類對象。如果用基類類型的指針指向派生類對象,就可以通過這個指針來訪問該對象。問題是派生到的只是從基類繼承來的同名成員。
解決這一問題的辦法就是:如果需要通過基類的指針指向派生類的對象,并訪問某個與基類同名的成員(如果是函數,則原型完全相同)。那么,首先在基類中將這個同名函數說明為虛函數。
這樣,通過基類類型指針,就可以使屬于不同派生類的不同對象產生不同的行為,從而實現運行過程中的多態。
一般虛成員函數實現的3個條件:
(1)首先類之間應滿足賦值兼容規則。
(2)聲明虛函數。
(3)由成員函數調用,或者通過指針、引用來訪問虛函數。
如果使用對象名來訪問虛函數,則聯編在編譯過程中就可以通過(靜態聯編),而無需在運行中進行。
虛析構函數:
如果一個類的析構函數時虛函數,那么,用它派生而來的所用子類的析構函數也是虛函數。析構函數設置為虛函數之后,在使用指針,引用時就可以動態聯編,實現運行時的多態,保證使用基類類型的指針就能夠調用適當的析構函數針對不同的對象進行清理工作。
抽象類:
(1)抽象類是一種特殊的類,它為一族類提供統一的操作界面,通過它為一個類族建立一個公共的接口,使類能夠更加有效的發揮多態性。
(2)建立抽象類,就是為了通過它多態地使用其中的成員函數。
(3)抽象類處于其層次的上層,一個抽象類自身無法實現化,而只能通過繼承機制。生成抽象類的非抽象派生類,然后實例化。但是,可以聲明一個抽象類的指針和引用。
(4)抽象類是帶有純虛函數的類。
(5)抽象類派生出新類之后,如果派生類沒有給出全部純虛函數的實現,這時的派生類仍是一個抽象類。
(6)純虛函數:virtual 函數類型 函數名(參數表)=0;
2 繼承討論的是類與類的層次關系,多態則是考慮在不同層次的類中,以及在同一個類的內部,同名成員函數之間的關系問題,是解決功能和行為的再抽象問題。
3 多態是指類族中具有相似功能的不同函數使用同一個名稱來實現,從而可以使用相同的調用方式來調用這些具有不同功能的同名函數。
類型:
面向對象的多態性可以分為4類:
專用多態:
(1)重載多態:普通函數以及成員函數的重載。
(2)強制多態:將一個變量的類型加以變化。
通用多態:
(3)包含多態:研究類族中定義于不同類中的同名成員函數的多態行為,主要通過虛函數來實現。
(4)參數多態:與類模板相關聯。
實現:
多態從實現的角度可以分為:
(1)編譯時的多態:靜態聯編(重載、強制、參數),程序編譯連接階段完成。
(2)運行時的多態:動態聯編(包含),程序運行階段完成。
聯編:是指計算機程序自身彼此關聯的過程,就是把一條消息和一個對象的方法相結合的過程。
運算符重載:
運算符重載的實質是函數重載,在實現過程中,首先把指定的運算表達式轉化為對運算符函數的調用,運算對象轉化為運算符函數的形參,然后根據實參的類型來確定需要調用的函數,這個過程是在編譯過程中實現的。不能重載的運算符有5個:“.”,“*”,“::”,“? :”“sizeof”。
虛函數:
虛函數是動態聯編的基礎,虛函數是非靜態成員函數,虛函數經過派生之后,在類族中可以實現運行過程中的多態。
根據賦值兼容規則,可以使用派生類對象代替基類對象。如果用基類類型的指針指向派生類對象,就可以通過這個指針來訪問該對象。問題是派生到的只是從基類繼承來的同名成員。
解決這一問題的辦法就是:如果需要通過基類的指針指向派生類的對象,并訪問某個與基類同名的成員(如果是函數,則原型完全相同)。那么,首先在基類中將這個同名函數說明為虛函數。
這樣,通過基類類型指針,就可以使屬于不同派生類的不同對象產生不同的行為,從而實現運行過程中的多態。
一般虛成員函數實現的3個條件:
(1)首先類之間應滿足賦值兼容規則。
(2)聲明虛函數。
(3)由成員函數調用,或者通過指針、引用來訪問虛函數。
如果使用對象名來訪問虛函數,則聯編在編譯過程中就可以通過(靜態聯編),而無需在運行中進行。
虛析構函數:
如果一個類的析構函數時虛函數,那么,用它派生而來的所用子類的析構函數也是虛函數。析構函數設置為虛函數之后,在使用指針,引用時就可以動態聯編,實現運行時的多態,保證使用基類類型的指針就能夠調用適當的析構函數針對不同的對象進行清理工作。
抽象類:
(1)抽象類是一種特殊的類,它為一族類提供統一的操作界面,通過它為一個類族建立一個公共的接口,使類能夠更加有效的發揮多態性。
(2)建立抽象類,就是為了通過它多態地使用其中的成員函數。
(3)抽象類處于其層次的上層,一個抽象類自身無法實現化,而只能通過繼承機制。生成抽象類的非抽象派生類,然后實例化。但是,可以聲明一個抽象類的指針和引用。
(4)抽象類是帶有純虛函數的類。
(5)抽象類派生出新類之后,如果派生類沒有給出全部純虛函數的實現,這時的派生類仍是一個抽象類。
(6)純虛函數:virtual 函數類型 函數名(參數表)=0;
總結
以上是生活随笔為你收集整理的C++中对多态的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是一致性Hash算法?
- 下一篇: react ssr方法