虛擬函數(shù)虛擬函數(shù)的特性
時間:2023-03-26 12:46:02 | 來源:營銷百科
時間:2023-03-26 12:46:02 來源:營銷百科
虛擬函數(shù)虛擬函數(shù)的特性:虛擬函數(shù)是C 語言引入的一個很重要的特性,它提供了'動態(tài)綁定'機制,正是這一機制使得繼承的語義變得相對明晰。
(1)基類抽象了通用的數(shù)據(jù)及操作,就數(shù)據(jù)而言,如果該數(shù)據(jù)成員在各派生類中都需要用到,那么就需要將其聲明在基類中;就操作而言,如果該操作對各派生類都有意義,無論其語義是否會被修改或擴展,那么就需要將其聲明在基類中。
(2)有些操作,如果對于各個派生類而言,語義保持完全一致,而無需修改或擴展,那么這些操作聲明為基類的非虛擬成員函數(shù)。各派生類在聲明為基類的派生類時,默認繼承了這些非虛擬成員函數(shù)的聲明/實現(xiàn),如同默認繼承基類的數(shù)據(jù)成員一樣,而不必另外做任何聲明,這就是繼承帶來的代碼重用的優(yōu)點。
(3)另外還有一些操作,雖然對于各派生類而言都有意義,但是其語義并不相同。這時,這些操作應該聲明為基類的虛擬成員函數(shù)。各派生類雖然也默認繼承了這些虛擬成員函數(shù)的聲明/實現(xiàn),但是語義上它們應該對這些虛擬成員函數(shù)的實現(xiàn)進行修改或者擴展。另外在實現(xiàn)這些修改或擴展過程中,需要用到額外的該派生類獨有的數(shù)據(jù)時,將這些數(shù)據(jù)聲明為此派生類自己的數(shù)據(jù)成員。
再考慮更大背景下的繼承體系,當更高層次的程序框架(繼承體系的使用者)使用此繼承體系時,它處理的是一個抽象層次的對象集合(即基類)。雖然這個對象集合的成員實質(zhì)上可能是各種派生類對象,但在處理這個對象集合中的對象時,它用的是抽象層次的操作。并不區(qū)分在這些操作中,哪些操作對各派生類來說是保持不變的,而哪些操作對各派生類來說有所不同。這是因為,當運行時實際執(zhí)行到各操作時,運行時系統(tǒng)能夠識別哪些操作需要用到'動態(tài)綁定',從而找到對應此派生類的修改或擴展的該操作版本。
也就是說,即只需關(guān)心它自己問題域的業(yè)務邏輯,只要保證正確,其任務就算完成了。即使繼承體系內(nèi)部增加了某種派生類,或者刪除了某種派生類,或者某某派生類的某個虛擬函數(shù)的實現(xiàn)發(fā)生了改變,它的代碼不必任何修改。這也意味著,程序的模塊化程度得到了極大的提高。而模塊化的提高也就意味著可擴展性、可維護性,以及代碼的可讀性的提高,這也是'面向?qū)ο?編程的一個很大的優(yōu)點。