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

C++深入探究不同的繼承體系

 更新時(shí)間:2022年05月25日 08:35:34   作者:Suk-god  
繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對父類的允許訪問的方法實(shí)行的過程進(jìn)行重新編寫,返回值和形參都不能改變。就是對原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫

聲明:

本文的測試環(huán)境為Windows平臺下的VS2013環(huán)境

單繼承

一個(gè)子類只有一個(gè)父類。這類繼承方式是最為簡單的。具體可以參考繼承 上篇中的例子。這里給出簡單的圖示即可:

多繼承

一個(gè)子類有兩個(gè)或兩個(gè)以上的直接父類,這樣的繼承關(guān)系稱之為多繼承。

圖解:

注意事項(xiàng):

 ①在多繼承的場景下,建議在繼承的每一個(gè)基類名稱前都加上繼承方式,如果不加,可能無法達(dá)到我們的預(yù)期結(jié)果。

 結(jié)論:

  class修飾的類,如果不顯式添加繼承方式,默認(rèn)是private

  struct修飾的類,如果不顯式添加繼承方式,默認(rèn)是public

②多繼承的對象模型隨著子類繼承基類的順序變化而變化

該如何理解上面這句話呢?

來看這兩種情況:

Ⅰ、先繼承Base1,再繼承Base2

Ⅱ、先繼承Base2,再繼承Base1

菱形繼承

概念

了解了上面的兩種繼承方式,下面我們介紹一種單繼承與多繼承有機(jī)結(jié)合的產(chǎn)品,他就是菱形繼承!

它的圖解如下:

存在的問題

1、存在二義性問題

 最頂層基類成員在最底層子類中存在兩份,如果直接通過最底層子類訪問最頂層的基類成員時(shí),會(huì)出現(xiàn)訪問不明確問題。

2、存在數(shù)據(jù)冗余問題

我們來分析一下最底層子類的對象模型:

這里的最頂層基類為了說明問題,只有一個(gè)成員變量,但是實(shí)際中基類中的內(nèi)容往往很多,數(shù)據(jù)量很大。如果不解決這個(gè)問題,那將會(huì)存在著嚴(yán)重的空間浪費(fèi)。這是不允許的!

解決方案

解決辦法:

可見,讓訪問明確化并不能直接解決問題!而真正能夠解決問題的是采用菱形虛擬繼承。這個(gè)接下來就會(huì)介紹到。

菱形虛擬繼承

什么是菱形虛擬繼承?

我們先不著急回答這個(gè)問題,首先我們應(yīng)該搞明白什么是虛擬繼承!!

虛擬繼承

什么是虛擬繼承

使用虛擬關(guān)鍵字virtual修飾的繼承稱之為虛擬繼承

 虛擬繼承存在的意義就是 :為了解決菱形繼承存在的二義性和數(shù)據(jù)冗余的問題

內(nèi)存層面理解虛擬繼承

虛擬繼承和普通單繼承的區(qū)別

主要有4點(diǎn),具體如下:

虛擬繼承+菱形繼承

菱形虛擬繼承實(shí)現(xiàn)如下:

也即:

class Base
{
protected:
	int _b;
};
class Derived1 : virtual public Base
{
protected:
	int _d1;
};
class Derived2 : virtual public Base
{
protected:
	int _d2;
};
class D : public Derived1, public Derived2
{
public:
	D()
	{
	}
	void Func()
	{
		_b = 1;
		_d1 = 2;
		_d2 = 3;
	}
protected:
	int _dd;
};
int main()
{
	D d;
	d.Func();
	return 0;
}

分析執(zhí)行過程及d的對象模型:

總結(jié):菱形虛擬繼承是通過讓最頂層基類的成員在最底層子類中只存儲一份的方式來解決的。

到此這篇關(guān)于C++深入探究不同的繼承體系的文章就介紹到這了,更多相關(guān)C++繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C++中的string 類型占幾個(gè)字節(jié)

    淺談C++中的string 類型占幾個(gè)字節(jié)

    本篇文章小編并不是為大家講解string類型的用法,而是講解我個(gè)人比較好奇的問題,就是string 類型占幾個(gè)字節(jié)
    2013-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串

    C語言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中動(dòng)態(tài)分配實(shí)現(xiàn)串的實(shí)例,需要的朋友可以參考下
    2017-10-10
  • C語言銀行儲蓄系統(tǒng)源碼

    C語言銀行儲蓄系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了C語言銀行儲蓄系統(tǒng)源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C 語言基礎(chǔ)教程(一)顏色加亮

    C 語言基礎(chǔ)教程(一)顏色加亮

    C 語言基礎(chǔ)教程(一)顏色加亮...
    2007-02-02
  • 關(guān)于STL中set容器的一些總結(jié)

    關(guān)于STL中set容器的一些總結(jié)

    關(guān)于set,必須說明的是set關(guān)聯(lián)式容器。set作為一個(gè)容器也是用來存儲同一數(shù)據(jù)類型的數(shù)據(jù)類型,并且能從一個(gè)數(shù)據(jù)集合中取出數(shù)據(jù),在set中每個(gè)元素的值都唯一,而且系統(tǒng)能根據(jù)元素的值自動(dòng)進(jìn)行排序
    2013-09-09
  • c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器

    c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器

    這篇文章主要介紹了c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器,幫助大家更好的理解和使用libuv,感興趣的朋友可以了解下
    2021-02-02
  • C++模板template用法小結(jié)(推薦)

    C++模板template用法小結(jié)(推薦)

    這篇文章主要介紹了C++模板template用法總結(jié) ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++實(shí)現(xiàn)簡單推箱子小游戲

    C++實(shí)現(xiàn)簡單推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 基于C語言實(shí)現(xiàn)UDP客戶端

    基于C語言實(shí)現(xiàn)UDP客戶端

    UDP是一種面向無連接的傳輸層協(xié)議,廣泛應(yīng)用于實(shí)時(shí)性要求較高的場景,本文將介紹如何使用C語言實(shí)現(xiàn)一個(gè)簡單的UDP客戶端程序,有需要的可以參考下
    2024-10-10
  • Java C++題解leetcode判定是否為字符重排

    Java C++題解leetcode判定是否為字符重排

    這篇文章主要為大家介紹了Java C++題解leetcode判定是否為字符重排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評論

嘉黎县| 堆龙德庆县| 临泉县| 东至县| 滨海县| 昆山市| 翼城县| 高清| 车致| 英吉沙县| 荃湾区| 云林县| 成安县| 宜兰市| 海丰县| 永春县| 陈巴尔虎旗| 吕梁市| 镇原县| 阳信县| 朔州市| 永川市| 大安市| 宁夏| 师宗县| 汝阳县| 平谷区| 揭东县| 四平市| 沙坪坝区| 汾阳市| 于都县| 吴堡县| 原平市| 原阳县| 镇康县| 天镇县| 崇义县| 田林县| 建水县| 谢通门县|