劍指XX游戲(四)-輕松搞定面試中的“虛”-創(chuàng)新互聯(lián)

提要

    今天要整理的知識點是C++中有關虛的一切。

站在用戶的角度思考問題,與客戶深入溝通,找到湞江網(wǎng)站設計與湞江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設計、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋湞江地區(qū)。

    包括:虛函數(shù),純虛函數(shù),虛基類,虛繼承...


1.什么是虛函數(shù),有什么作用?

在基類用virtual聲明成員函數(shù)為虛函數(shù)。這樣就可以在派生類中重新定義此函數(shù),為它賦予新的功能,并能方便地被調(diào)用。在類外定義虛函數(shù)時,不必再加virtual。該函數(shù)就是虛函數(shù)了。虛函數(shù)是多態(tài)性的基礎,其調(diào)用的方式是動態(tài)聯(lián)編(程序運行時才決定調(diào)用基類的還是子類)。虛函數(shù)的作用是允許在派生類中重新定義與基類同名的函數(shù),并且可以通過基類指針或引用來訪問基類和派生類中的同名函數(shù),達到多態(tài)的目的。

2.什么是純虛函數(shù),什么是純虛類,有什么作用?

純虛函數(shù)只有函數(shù)的名字而不具備函數(shù)的功能,不能被調(diào)用。它只是通知編譯系統(tǒng):“在這里聲明一個虛函數(shù),留待派生類中定義”。在派生類中對此函數(shù)提供定義后,它才能具備函數(shù)的功能,可被調(diào)用。聲明純虛函數(shù)的一般形式是
              virtual 函數(shù)類型 函數(shù)名 (參數(shù)表列)=0;

純虛類也稱抽象類,凡是包含純虛函數(shù)的類都是抽象類。因為純虛函數(shù)是不能被調(diào)用的,包含純虛函數(shù)的類是無法建立對象的。

抽象類的作用是作為一個類族的共同基類,或者說,為一個類族提供一個公共接口。

3.為什么有的類的析構(gòu)函數(shù)需要設為virtual?是否每個類的析構(gòu)函數(shù)都要設置成virtual?是否可以將析構(gòu)函數(shù)設置成內(nèi)聯(lián)函數(shù)。

這樣做是為了當用一個基類的指針刪除一個派生類的對象時,派生類的析構(gòu)函數(shù)會被調(diào)用。
當然,并不是要把所有類的析構(gòu)函數(shù)都寫成虛函數(shù)。因為當類里面有虛函數(shù)的時候,編譯器會給類添加一個虛函數(shù)表,里面來存放虛函數(shù)指針,這樣就會增加類的存儲空間。所以,只有當一個類被用來作為基類的時候,才把析構(gòu)函數(shù)寫成虛函數(shù)。

可以。

4.析構(gòu)函數(shù)是否可以是純虛函數(shù)?

可以,當需要定義一個抽象類,如果其中沒有其他合適的函數(shù),可以把析構(gòu)函數(shù)定義為純虛的。

5.是否可以將構(gòu)造函數(shù)聲明為virtual?

虛函數(shù)的意思就是開啟動態(tài)綁定,程序會根據(jù)對象的動態(tài)類型來選擇要調(diào)用的方法。然而在構(gòu)造函數(shù)運行的時候,這個對象的動態(tài)類型還不完整,沒有辦法確定它到底是什么類型,故構(gòu)造函數(shù)不能動態(tài)綁定。(動態(tài)綁定是根據(jù)對象的動態(tài)類型而不是函數(shù)名,在調(diào)用構(gòu)造函數(shù)之前,這個對象根本就不存在,它怎么動態(tài)綁定?)


6.是否可以在析構(gòu)函數(shù)或者構(gòu)造函數(shù)中調(diào)用虛函數(shù)?

在構(gòu)造函數(shù)不要調(diào)用虛函數(shù)。在基類構(gòu)造的時候,虛函數(shù)是非虛,不會走到派生類中,既是采用的靜態(tài)綁定。顯然的是:當我們構(gòu)造一個子類的對象時,先調(diào)用基類的構(gòu)造函數(shù),構(gòu)造子類中基類部分,子類還沒有構(gòu)造,還沒有初始化,如果在基類的構(gòu)造中調(diào)用虛函數(shù),如果可以的話就是調(diào)用一個還沒有被初始化的對象,那是很危險的,所以C++中是不可以在構(gòu)造父類對象部分的時候調(diào)用子類的虛函數(shù)實現(xiàn)。但是不是說你不可以那么寫程序,你這么寫,編譯器也不會報錯。只是你如果這么寫的話編譯器不會給你調(diào)用子類的實現(xiàn),而是還是調(diào)用基類的實現(xiàn)。

 在析構(gòu)函數(shù)中也不要調(diào)用虛函數(shù)。在析構(gòu)的時候會首先調(diào)用子類的析構(gòu)函數(shù),析構(gòu)掉對象中的子類部分,然后在調(diào)用基類的析構(gòu)函數(shù)析構(gòu)基類部分,如果在基類的析構(gòu)函數(shù)里面調(diào)用虛函數(shù),會導致其調(diào)用已經(jīng)析構(gòu)了的子類對象里面的函數(shù),這是非常危險的。

7.什么叫虛繼承?有什么作用?

虛繼承,就是在被繼承的類前面加上virtual關鍵字,這時被繼承的類稱為虛基類。虛繼承在多重繼承的時可以防止二義性。主要用在如下的菱形繼承:

class A class B1:public virtual A; class B2:public virtual A; class D:public B1,public B2;

由于共享所以不必要在對象內(nèi)存中保存多份虛基類子對象的拷貝,這樣較之多繼承節(jié)省空間。虛擬繼承與普通繼承不同的是,虛擬繼承可以防止出現(xiàn)diamond繼承時,一個派生類中同時出現(xiàn)了兩個基類的子對象。也就是說,為了保證這一點,在虛擬繼承情況下,基類子對象的布局是不同于普通繼承的。因此,它需要多出一個指向基類子對象的指針。


8.什么是虛函數(shù)表?

為實現(xiàn)動態(tài)聯(lián)編,編譯器為每個包含虛函數(shù)的類創(chuàng)建一個表,稱為vtable,在vtable中,編譯器放置了特定類的虛函數(shù)地址,在每個帶有虛函數(shù)的類中編譯器會秘密地設置一個虛函數(shù)表指針,稱為vptr,指向?qū)ο蟮膙table,通過基類指針做虛函數(shù)調(diào)用時,也就是多態(tài)調(diào)用時,編譯器靜態(tài)地插入取得這個vptr,并在vtable表種查找函數(shù)地址的代碼,這樣就能調(diào)用正確的函數(shù)。

9.什么是動態(tài)聯(lián)編?

動態(tài)聯(lián)編是指在程序執(zhí)行的時候才將函數(shù)實現(xiàn)和函數(shù)調(diào)用關聯(lián),因此也叫運行時綁定或者晚綁定,動態(tài)聯(lián)編對函數(shù)的選擇不是基于指針或者引用,而是基于對象類型,不同的對象類型將做出不同的編譯結(jié)果。C++中一般情況下聯(lián)編也是靜態(tài)聯(lián)編,但是一旦涉及到多態(tài)和虛擬函數(shù)就必須要使用動態(tài)聯(lián)編了。

10.什么是RTTI?

RTTI(Run-Time Type Information)運行時類型檢查的英文縮寫,它提供了運行時確定對象類型的方法,通過RTTI,能夠通過基類的指針或引用來檢索其所指對象的實際類型。c++通過下面兩個操作符提供RTTI:

(1)typeid:返回指針或引用所指對象的實際類型。
(2)dynamic_cast:將基類類型的指針或引用安全的轉(zhuǎn)換為派生類型的指針或引用。
對于帶虛函數(shù)的類,在運行時執(zhí)行RTTI操作符,返回動態(tài)類型信息;對于其他類型,在編譯時執(zhí)行RTTI,返回靜態(tài)類型信息。

參考

眾網(wǎng)友博客

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文題目:劍指XX游戲(四)-輕松搞定面試中的“虛”-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://bm7419.com/article38/gjipp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航網(wǎng)站排名、網(wǎng)頁設計公司、小程序開發(fā)手機網(wǎng)站建設、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設