最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于C++中虛擬繼承的一些總結(jié)分析

 更新時間:2013年09月09日 10:46:10   作者:  
虛擬繼承在一般的應(yīng)用中很少用到,所以也往往被忽視,這也主要是因為在C++中,多重繼承是不推薦的,也并不常用

1.為什么要引入虛擬繼承
虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現(xiàn)的。如:類D繼承自類B1、B2,而類B1、B2都繼承自類A,因此在類D中兩次出現(xiàn)類A中的變量和函數(shù)。為了節(jié)省內(nèi)存空間,可以將B1、B2對A的繼承定義為虛擬繼承,而A就成了虛擬基類。實現(xiàn)的代碼如下:

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

虛擬繼承在一般的應(yīng)用中很少用到,所以也往往被忽視,這也主要是因為在C++中,多重繼承是不推薦的,也并不常用,而一旦離開了多重繼承,虛擬繼承就完全失去了存在的必要因為這樣只會降低效率和占用更多的空間。

2.引入虛繼承和直接繼承會有什么區(qū)別呢
由于有了間接性和共享性兩個特征,所以決定了虛繼承體系下的對象在訪問時必然會在時間和空間上與一般情況有較大不同。

2.1時間:在通過繼承類對象訪問虛基類對象中的成員(包括數(shù)據(jù)成員和函數(shù)成員)時,都必須通過某種間接引用來完成,這樣會增加引用尋址時間(就和虛函數(shù)一樣),其實就是調(diào)整this指針以指向虛基類對象,只不過這個調(diào)整是運(yùn)行時間接完成的。

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

3.筆試,面試中??嫉腃++虛擬繼承的知識點(diǎn)

復(fù)制代碼 代碼如下:

第一種情況:      第二種情況:     第三種情況       第四種情況:
class a            class a        class a         class a
{                   {           {            {
    virtual void func();  virtual void func(); virtual void func();   virtual void func();
};             };          char x;          char x;
class b:public virtual a   class b :public a   };             };
{             {            class b:public virtual a  class b:public a
    virtual void foo();  virtual void foo();  {             {
};            };           virtual void foo();    virtual void foo();

如果對這四種情況分別求sizeof(a),  sizeof(b)。結(jié)果是什么樣的呢?下面是輸出結(jié)果:(在vc6.0中運(yùn)行)

第一種:4,12
第二種:4,4
第三種:8,16
第四種:8,8

想想這是為什么呢?

因為每個存在虛函數(shù)的類都要有一個4字節(jié)的指針指向自己的虛函數(shù)表,所以每種情況的類a所占的字節(jié)數(shù)應(yīng)該是沒有什么問題的,那么類b的字節(jié)數(shù)怎么算呢?看“第一種”和“第三種”情況采用的是虛繼承,那么這時候就要有這樣的一個指針vptr_b_a,這個指針叫虛類指針,也是四個字節(jié);還要包括類a的字節(jié)數(shù),所以類b的字節(jié)數(shù)就求出來了。而“第二種”和“第四種”情況則不包括vptr_b_a這個指針,這回應(yīng)該木有問題了吧。

4.c++重載、覆蓋、隱藏的區(qū)別和執(zhí)行方式
既然說到了繼承的問題,那么不妨討論一下經(jīng)常提到的重載,覆蓋和隱藏

4.1成員函數(shù)被重載的特征
(1)相同的范圍(在同一個類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無。

4.2“覆蓋”是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual 關(guān)鍵字。

4.3“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),特征是:
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同,此時,不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。

(2)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)相同,但是基類函數(shù)沒有virtual 關(guān)鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆)。

小結(jié):說白了就是如果派生類和基類的函數(shù)名和參數(shù)都相同,屬于覆蓋,這是可以理解的吧,完全一樣當(dāng)然要覆蓋了;如果只是函數(shù)名相同,參數(shù)并不相同,則屬于隱藏。

4.4 三種情況怎么執(zhí)行:
4.4.1 重載:看參數(shù)。
4.4.2 隱藏:用什么就調(diào)用什么。
4.4.3 覆蓋:調(diào)用派生類。

相關(guān)文章

  • C++ 11實現(xiàn)檢查是否存在特定的成員函數(shù)

    C++ 11實現(xiàn)檢查是否存在特定的成員函數(shù)

    C++11/14相比以往的C++98/03在很多方面做了簡化和增強(qiáng),尤其是在泛型編程方面,讓C++的泛型編程的威力變得更加強(qiáng)大,下面這篇文章主要介紹了利用C++ 11實現(xiàn)檢查是否存在特定成員函數(shù)的相關(guān)資料,需要的朋友可以參考下。
    2017-02-02
  • Qt6子窗口全屏顯示的實現(xiàn)示例

    Qt6子窗口全屏顯示的實現(xiàn)示例

    在Qt開發(fā)中,有時候需要讓程序窗口全屏顯示,本文主要介紹了Qt6子窗口全屏顯示的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時候要用new?

    C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時候要用new?

    這篇文章主要介紹了C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時候要用new?本文講解了使用new創(chuàng)建動態(tài)結(jié)構(gòu)體、為什么要有new、自動存儲(自動變量、局部變量)、動態(tài)存儲、vector和array等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • C/C++實現(xiàn)俄羅斯方塊游戲

    C/C++實現(xiàn)俄羅斯方塊游戲

    這篇文章主要介紹了如何利用C/C++實現(xiàn)經(jīng)典游戲之一的俄羅斯方塊,文中的實現(xiàn)步驟講解詳細(xì),對我們學(xué)習(xí)C語言和C++有一定的幫助,需要的可以參考一下
    2022-02-02
  • OpenCV實現(xiàn)可分離濾波

    OpenCV實現(xiàn)可分離濾波

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)可分離濾波,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言冒泡排序超全面實現(xiàn)流程

    C語言冒泡排序超全面實現(xiàn)流程

    算法中排序是十分重要的,而每一個學(xué)習(xí)計算機(jī)的都會在初期的時候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言冒泡排序的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 詳談C++中虛基類在派生類中的內(nèi)存布局

    詳談C++中虛基類在派生類中的內(nèi)存布局

    下面小編就為大家?guī)硪黄斦凜++中虛基類在派生類中的內(nèi)存布局。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言進(jìn)階棧幀示例詳解教程

    C語言進(jìn)階棧幀示例詳解教程

    這篇文章主要為大家介紹了C語言進(jìn)階棧幀的示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • C語言memset函數(shù)詳解

    C語言memset函數(shù)詳解

    這篇文章主要介紹了C語言中的memset()函數(shù),包括其與memcpy()函數(shù)的區(qū)別,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C語言結(jié)構(gòu)體的全方面解讀

    C語言結(jié)構(gòu)體的全方面解讀

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項
    2021-10-10

最新評論

湟中县| 宽甸| 信宜市| 太仓市| 呈贡县| 洞头县| 墨竹工卡县| 叙永县| 蓬安县| 龙胜| 贺兰县| 无为县| 辽阳市| 开封县| 和田县| 弥勒县| 永年县| 新安县| 大宁县| 陆丰市| 西华县| 鹤壁市| 靖远县| 新邵县| 宁海县| 乌苏市| 太康县| 永泰县| 高陵县| 繁峙县| 象山县| 南京市| 台东市| 蚌埠市| 宣化县| 万山特区| 靖宇县| 临桂县| 安顺市| 合阳县| 井陉县|