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

深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

 更新時間:2023年07月31日 14:16:21   作者:Aomnitrix  
我們知道C語言是面向過程的編程語言,C++在C語言的基礎(chǔ)上進化出了面向?qū)ο蟮哪P?,而繼承就是面向?qū)ο蟮闹匾獙傩?,下面就讓小編來和大家詳細講講吧

一.繼承

1.繼承與面向?qū)ο?/h3>

我們知道C語言是面向過程的編程語言,C++在C語言的基礎(chǔ)上進化出了面向?qū)ο蟮哪P?。而繼承就是面向?qū)ο蟮闹匾獙傩浴@^承使得我們在一個基礎(chǔ)屬性上能夠加以拓展,用來描述很多具有相同基本屬性又各有不同的事務(wù)。

2.繼承方式訪問權(quán)限

繼承方式與訪問權(quán)限相同都有三種:public、private、protected繼承,再結(jié)合基類的三種訪問權(quán)限,在派生類中就有九種不同的情況,可以總結(jié)為:基類為私有的成員在派生類一律不可見,其余權(quán)限按照與繼承方式相比較小的來。

3.切片(賦值轉(zhuǎn)換)

在實際應(yīng)用場景中我們常用基類代表幾種事務(wù)共同的基本屬性,派生類用來代表自己獨特的屬性,這就會導(dǎo)致派生類對象一定是包含父類對象的,所以子類對象可以賦給父類對象/指針/引用,過程會將子類中獨特屬性的成員切出,剩余賦給父類對象,所以稱為切片,不僅如此基類的指針可以通過強制類型轉(zhuǎn)換賦值給派生類的指針,代碼演示如下:

class Person
{
protected:
	string _name; 
	string _sex;
	int _age; 
};
class Student : public Person
{
public:
	int _No;
};
void Test()
{
	Student sobj;
	// 子類對象可以賦值給父類對象/指針/引用
	Person pobj = sobj;
	Person* pp = &sobj;
	Person& rp = sobj;
	// 基類的指針可以通過強制類型轉(zhuǎn)換賦值給派生類的指針
	pp = &sobj;
	Student * ps1 = (Student*)pp; // 這種情況轉(zhuǎn)換時可以的。
	ps1->_No = 10;
	pp = &pobj;
	Student* ps2 = (Student*)pp; // 這種情況轉(zhuǎn)換時雖然可以,但是會存在越界訪問的問
	ps2->_No = 10;
}
int main()
{
	Test();
	return 0;
}

4.作用域

如果在基類和派生類定義了同名函數(shù)就會構(gòu)成隱藏/重定義,子類成員將屏蔽父類對同名成員的直接訪問,如下所示;

class A
{
public:
	A(int num = 0)
	:_num(num)
	{}
	void func()
	{
		cout << _num << endl;
	}
private:
	int _num;
};
class B : public A
{
public:
	B(int val = 1)
		:_val(val)
	{}
	void func()
	{
		cout << _val<< endl;
	}
private:
	int _val;
};
int main()
{
	B b;
	b.func();
	b.A::func();
	return 0;
}

5.默認成員函數(shù)

繼承這里遵循著一個規(guī)則:構(gòu)造先父后子,析構(gòu)先子后父。因為派生類中一定包含基類的對象所以派生類的構(gòu)造函數(shù)必須調(diào)用基類的構(gòu)造函數(shù)初始化基類的那一部分成員,如果基類沒有默認的構(gòu)造函數(shù)(無參、全缺省、編譯器默認生成),則必須在派生類構(gòu)造函數(shù)的初始化列表階段顯示調(diào)用。

派生類的拷貝構(gòu)造函數(shù)必須調(diào)用基類的拷貝構(gòu)造完成基類的拷貝初始化。

派生類的operator=必須要調(diào)用基類的operator=完成基類的復(fù)制。

基類的析構(gòu)函數(shù)調(diào)用后會自動調(diào)用基類的析構(gòu)函數(shù),不能在派生類顯示調(diào)用不然無法保證析構(gòu)先子后父的順序。

6.友元與靜態(tài)函數(shù)

友元關(guān)系不會繼承,靜態(tài)函數(shù)不會多次實例化。

7.解決菱形繼承的二義性與數(shù)據(jù)冗余

菱形繼承是多繼承的一種特殊情況,我們在編寫代碼時應(yīng)要避免菱形繼承:

如上圖所示就是一個菱形繼承,這樣會導(dǎo)致A類中會有兩份P類中的成員,這樣不僅會浪費空間,而且會產(chǎn)生二義性,如果我通過A對象訪問P中的成員,因為A類中有兩份P中的成員所有會有歧義。為了解決此問題,出現(xiàn)了虛擬繼承。如下圖所示:

那虛繼承是如何完成的呢:在d類中建立虛基表,將原來冗余的對象放在d對象空間最下面,B、C原來存儲A的位置存儲當前位置與空間最下面A對象的偏移量,保證指定B或者C對象訪問_a時都能訪問到。

8.繼承與組合

與繼承相比組合的耦合度更低,更適合我們使用!繼承又稱為白箱復(fù)用,組合稱為黑盒復(fù)用,因為使用組合的話是無法看到類內(nèi)部的設(shè)計。

到此這篇關(guān)于深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念的文章就介紹到這了,更多相關(guān)C++繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言 操作符#與##使用方法詳解

    C語言 操作符#與##使用方法詳解

    在類函數(shù)宏中(帶參數(shù)的宏),#號作為一個預(yù)處理運算符,可以把記號轉(zhuǎn)換成字符串。##相當于連接符,它會將兩邊的內(nèi)容連接起來,形成新的標識符,下面請看詳細的教程
    2022-04-04
  • C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例

    C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例

    這篇文章主要介紹了C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C++ cmake實現(xiàn)日志類的示例代碼

    C++ cmake實現(xiàn)日志類的示例代碼

    CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。本文就來利用cmake實現(xiàn)日志類,感興趣的小伙伴可以了解一下
    2023-03-03
  • windows下vscode使用cmake的方法

    windows下vscode使用cmake的方法

    這篇文章主要介紹了windows下vscode使用cmake的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++實現(xiàn) 單例模式實例詳解

    C++實現(xiàn) 單例模式實例詳解

    這篇文章主要介紹了C++實現(xiàn) 單例模式實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言程序如何求學(xué)生總成績和平均成績

    C語言程序如何求學(xué)生總成績和平均成績

    這篇文章主要介紹了C語言程序如何求學(xué)生總成績和平均成績,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • OpenCV使用GrabCut實現(xiàn)摳圖功能

    OpenCV使用GrabCut實現(xiàn)摳圖功能

    Grabcut是基于圖割(graph cut)實現(xiàn)的圖像分割算法,它需要用戶輸入一個bounding box作為分割目標位置,實現(xiàn)對目標與背景的分離/分割。本文將使用GrabCut實現(xiàn)摳圖功能,需要的可以參考一下
    2023-02-02
  • C語言中雙向鏈表和雙向循環(huán)鏈表詳解

    C語言中雙向鏈表和雙向循環(huán)鏈表詳解

    這篇文章主要介紹了C語言中雙向鏈表和雙向循環(huán)鏈表詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言實現(xiàn)24位彩色圖像二值化

    C語言實現(xiàn)24位彩色圖像二值化

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)24位彩色圖像二值化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ std::unique_lock 用法實例詳解

    C++ std::unique_lock 用法實例詳解

    std::unique_lock 是 C++11 提供的一個用于管理互斥鎖的類,它提供了更靈活的鎖管理功能,適用于各種多線程場景,這篇文章給大家介紹了C++ std::unique_lock 用法,感興趣的朋友跟隨小編一起看看吧
    2023-09-09

最新評論

南召县| 云霄县| 祁门县| 志丹县| 宜都市| 昆明市| 吴桥县| 庆元县| 东平县| 肥城市| 志丹县| 连平县| 清水县| 涞源县| 高阳县| 板桥市| 平乡县| 桦甸市| 社旗县| 新密市| 句容市| 额敏县| 库车县| 长治县| 南阳市| 盖州市| 分宜县| 玛纳斯县| 武平县| 长子县| 靖西县| 溧水县| 瓦房店市| 昌宁县| 揭西县| 仪陇县| 绥化市| 深圳市| 高雄县| 济源市| 鸡西市|