国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++:面向?qū)ο蟠罂樱毫庑卫^承

這篇具有很好參考價(jià)值的文章主要介紹了C++:面向?qū)ο蟠罂樱毫庑卫^承。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.單繼承

1.概念

單繼承:一個(gè)子類只有一個(gè)直接父類時(shí)稱這個(gè)繼承關(guān)系為單繼承。

圖示:
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

2.多繼承

2.1概念

多繼承:一個(gè)子類有兩個(gè)或以上直接父類時(shí)稱這個(gè)繼承關(guān)系為多繼承。

圖示:
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

2.2菱形繼承

1.概念

菱形繼承:菱形繼承是多繼承的一種特殊情況。即:一個(gè)類是另外幾個(gè)類的子類,而這幾個(gè)子類又是另外一個(gè)類的父類。

基本模型:

C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

2.問(wèn)題

但是呢,菱形繼承卻有一些問(wèn)題:它會(huì)造成數(shù)據(jù)的冗余以及數(shù)據(jù)的二義性。比如下面,在Assistant的對(duì)象中Person成員會(huì)有兩份。

C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

3.樣例理解

注:以下在VS2022 X64環(huán)境下驗(yàn)證。

class A
{
public:
	int _a;
};
class B : public A
{
public:
	int _b;
};
class C : public A
{
public:
	int _c;
};
class D : public B, public C
{
public:
	int _d;
};
int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;
	return 0;
}
二義性

如果我們直接訪問(wèn)d中的_a,編譯器不知道要訪問(wèn)繼承B的 _a還是繼承C的 _a,會(huì)有歧義。

C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

數(shù)據(jù)冗余

首先觀察調(diào)試窗口:我們可以看到創(chuàng)建的d變量的地址。

C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
然后通過(guò)內(nèi)存窗口,我們可以看到d中存儲(chǔ)了2個(gè)_a,相同的部分就會(huì)重復(fù)存儲(chǔ)。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

對(duì)于內(nèi)存模型抽象化

C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

2.3菱形虛擬繼承(解決菱形繼承的問(wèn)題)

1.概念

菱形虛擬繼承就是在菱形繼承的腰部繼承時(shí)(即父類第一次有多個(gè)子類時(shí))加上關(guān)鍵字virtual即可。

2.樣例理解

其他部分不變,我們對(duì)于上述代碼進(jìn)行菱形虛擬繼承,并且加上一句直接訪問(wèn)的代碼(d._a = 100),再次進(jìn)行測(cè)試。

class A
{
public:
	int _a;
};
class B : virtual public A
{
public:
	int _b;
};
class C : virtual public A
{
public:
	int _c;
};
class D : public B, public C
{
public:
	int _d;
};
int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
    d._a = 100; //新增的一句代碼
	d._b = 3;
	d._c = 4;
	d._d = 5;
	return 0;
}

首先觀察調(diào)試窗口:我們可以看到創(chuàng)建的d變量的地址。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

此時(shí)再讓代碼執(zhí)行d.B::_a = 1這句,通過(guò)內(nèi)存窗口可以看到其變化,但是和菱形繼承的變化位置不同。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
再讓代碼執(zhí)行d.C::_a = 2這句,通過(guò)內(nèi)存窗口可以看到其是直接在原來(lái)的位置處改變的,只有一份 _a。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
再讓代碼執(zhí)行d._a = 100這句,內(nèi)存窗口變化如下:
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
再執(zhí)行d._b = 3這條語(yǔ)句。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
再執(zhí)行d._c = 4這條語(yǔ)句。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

再執(zhí)行d._d = 5這條語(yǔ)句。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
有個(gè)疑問(wèn),此處圈住的部分是什么呢?它看起來(lái)像一個(gè)地址(X64環(huán)境下),那么其是存儲(chǔ)什么的呢?

解釋一下,其確實(shí)為兩個(gè)指針,指向的一張表。這兩個(gè)指針叫虛基表指針,這兩個(gè)表叫虛基表。虛基表中存的偏移量。通過(guò)偏移量可以找到下面的A。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

通過(guò)內(nèi)存窗口可以觀察出:繼承的B中存儲(chǔ)了十六進(jìn)制下的28,即十進(jìn)制下的40。對(duì)比下圖,和偏移量相等。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

對(duì)于內(nèi)存模型抽象化

C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試

2.4總結(jié)

1.通過(guò)虛擬繼承,D類對(duì)象中只有一個(gè)A類的_a,從而解決了數(shù)據(jù)冗余和二義性。
2.菱形虛擬繼承的對(duì)象模型:
每個(gè)繼承對(duì)象中存儲(chǔ)一個(gè)虛基表,虛基類(即上例中的A)放在最下面,成為公共部分。
C++:面向?qū)ο蟠罂樱毫庑卫^承,c++,開(kāi)發(fā)語(yǔ)言,程序人生,交友,c語(yǔ)言,visualstudio,面試
3.存儲(chǔ)的地址的作用
其為虛基表指針,指向虛基表,虛基表中存儲(chǔ)偏移量,可以找到下面存儲(chǔ)的A。從而方便切片的場(chǎng)景。
4.菱形虛擬繼承也會(huì)改變中間類的結(jié)構(gòu),讓它們的結(jié)構(gòu)和D的結(jié)構(gòu)類似。
這樣是為了防止以下的場(chǎng)景:

D d;
B b;
B& ref = d;
ref = b;

如果不存儲(chǔ)成類似的結(jié)構(gòu),那么找到B類存儲(chǔ)的_a就比較困難。

3.問(wèn)題總結(jié)

1.C++有多繼承,為什么?為什么Java沒(méi)有?

這個(gè)得從C++歷史發(fā)展來(lái)看,在C++發(fā)展史中,在完善面向?qū)ο蟮倪^(guò)程中,祖師爺考慮到了現(xiàn)實(shí)生活中確實(shí)有一部分東西可以繼承多個(gè)類,比如西紅柿既是水果,又是蔬菜,因此C++有了多繼承。而Java在這方面通過(guò)C++的痛苦因此做出了 改變,只允許單繼承。

2.多繼承的問(wèn)題是什么?

多繼承本身沒(méi)有問(wèn)題,但是有多繼承就會(huì)有菱形繼承,而菱形繼承就有許多問(wèn)題。

3.菱形繼承的問(wèn)題是什么,如何解決?

數(shù)據(jù)冗余以及二義性。通過(guò)菱形虛擬繼承解決。

4.底層角度如何解決菱形繼承的問(wèn)題(數(shù)據(jù)冗余和二義性)?

菱形虛擬繼承在底層改變了數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu),將虛基類存儲(chǔ)在了最下面,作為公共部分,讓多繼承而來(lái)的父類的數(shù)據(jù)共享,共用一份,而在繼承的那部分中則存儲(chǔ)了虛表指針,指向虛基表,從而得到其中存儲(chǔ)的偏移量,進(jìn)而可以實(shí)現(xiàn)切片時(shí)數(shù)據(jù)的完整性。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860047.html

到了這里,關(guān)于C++:面向?qū)ο蟠罂樱毫庑卫^承的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++ 面向?qū)ο螅?)——繼承

    C++ 面向?qū)ο螅?)——繼承

    面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的一個(gè)概念是繼承。繼承允許我們依據(jù)另一個(gè)類來(lái)定義一個(gè)類,這使得創(chuàng)建和維護(hù)一個(gè)應(yīng)用程序變得更容易。這樣做,也達(dá)到了重用代碼功能和提高執(zhí)行效率的效果。 當(dāng)創(chuàng)建一個(gè)類時(shí),您不需要重新編寫(xiě)新的數(shù)據(jù)成員和成員函數(shù),只需指定新建的類

    2024年02月10日
    瀏覽(23)
  • C++ 面向?qū)ο笕筇匦浴^承

    C++ 面向?qū)ο笕筇匦浴^承

    ?1主頁(yè):我的代碼愛(ài)吃辣 ??2知識(shí)講解:C++ 繼承 ??3開(kāi)發(fā)環(huán)境:Visual Studio 2022 ??4前言:面向?qū)ο笕筇匦缘?,封裝,繼承,多態(tài),今天我們研究研究 C++的繼承 。 目錄 一.繼承的概念及定義 1.繼承的概念 ?2.繼承的定義 二. 繼承關(guān)系和訪問(wèn)限定符 ?三.基類和派生類對(duì)象賦

    2024年02月12日
    瀏覽(23)
  • 【面向?qū)ο笳Z(yǔ)言三大特性之 “繼承”】

    【面向?qū)ο笳Z(yǔ)言三大特性之 “繼承”】

    目錄 1.繼承的概念及定義 1.1繼承的概念 1.2 繼承定義 1.2.1定義格式 ?1.2.2繼承關(guān)系和訪問(wèn)限定符 ?1.2.3繼承基類成員訪問(wèn)方式的變化 2.基類和派生類對(duì)象賦值轉(zhuǎn)換 3.繼承中的作用域 4.派生類的默認(rèn)成員函數(shù) 5.繼承與友元 6. 繼承與靜態(tài)成員 7.復(fù)雜的菱形繼承及菱形虛擬繼承 8.繼

    2023年04月08日
    瀏覽(28)
  • go語(yǔ)言(十一)----面向?qū)ο罄^承

    go語(yǔ)言(十一)----面向?qū)ο罄^承

    一、面向?qū)ο罄^承 寫(xiě)一個(gè)父類 子類繼承 父類 子類的新方法 定義子類 兩種方法: 第一種: 第二種: 子類繼承父類的使用

    2024年01月22日
    瀏覽(27)
  • 【C++面向?qū)ο蟆?-- 繼承 的奧秘(上篇)

    【C++面向?qū)ο蟆?-- 繼承 的奧秘(上篇)

    個(gè)人主頁(yè):平行線也會(huì)相交?? 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會(huì)相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學(xué)習(xí)路線,望對(duì)大家有所幫助??? 希望我們一起努力、成長(zhǎng),共同進(jìn)步。?? C++支持面向?qū)ο?,其中面向?qū)ο笥腥筇匦裕?/p>

    2024年02月13日
    瀏覽(21)
  • 【C++面向?qū)ο蟆?-- 繼承 的奧秘(下篇)

    【C++面向?qū)ο蟆?-- 繼承 的奧秘(下篇)

    個(gè)人主頁(yè):平行線也會(huì)相交?? 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會(huì)相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學(xué)習(xí)路線,望對(duì)大家有所幫助??? 希望我們一起努力、成長(zhǎng),共同進(jìn)步。?? 接下來(lái)對(duì)C++繼承體系中的 作用域 展開(kāi)分析。 在C

    2024年02月12日
    瀏覽(20)
  • 第八站:C++面向?qū)ο?繼承和派生)

    第八站:C++面向?qū)ο?繼承和派生)

    ?派生:由父類派生出子類 繼承:子類繼承父類(繼承不會(huì)繼承 析構(gòu)函數(shù)和構(gòu)造函數(shù) : 父類的所有成員函數(shù),以及數(shù)據(jù)成員,都會(huì)被子類繼承! ) \\\"子類派生出的類\\\"會(huì)指向\\\"父類被繼承的類\\\", 父類就是基類 實(shí)例1: 先創(chuàng)建一個(gè)父類,有私有成員數(shù)據(jù)(name,和age),成員函數(shù),描述信息,有參的

    2024年01月19日
    瀏覽(17)
  • c++面向?qū)ο笾庋b、繼承、和多態(tài)

    c++面向?qū)ο笾庋b、繼承、和多態(tài)

    把客觀事物封裝成類,而且可以把自己的數(shù)據(jù)和方法設(shè)置為只能讓可信的類或者對(duì)象操作,對(duì)不可信的信息進(jìn)行隱藏(利用public,private,protected,friend)實(shí)現(xiàn) has-a :描述一個(gè)類由多個(gè)部件類構(gòu)成,一個(gè)類的成員屬性是另一個(gè)已經(jīng)定義好的類。 use-a:一個(gè)類使用另一個(gè)類,通過(guò)類之間

    2024年02月02日
    瀏覽(15)
  • 面向?qū)ο蟮娜筇匦灾^承(C++)

    面向?qū)ο蟮娜筇匦灾^承(C++)

    概念 ??繼承機(jī)制是面向?qū)ο缶幘幊淌勾a可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能,這樣產(chǎn)生新的類,稱為派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu),體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)知過(guò)程。繼承是類設(shè)計(jì)層次的復(fù)用。 定

    2024年02月06日
    瀏覽(46)
  • C++ 面向?qū)ο蠛诵?繼承、權(quán)限、多態(tài)、抽象類)

    繼承(Inheritance)是面向?qū)ο缶幊讨械囊粋€(gè)重要概念,它允許一個(gè)類(稱為派生類或子類)從另一個(gè)類(稱為基類或父類)繼承屬性和方法。繼承是實(shí)現(xiàn)類之間的關(guān)系,通過(guò)繼承,子類可以重用父類的代碼,并且可以在此基礎(chǔ)上添加新的功能或修改已有的功能。 在C++中,繼承

    2024年02月08日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包