欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C++不同繼承之間的關(guān)系

 更新時(shí)間:2023年04月18日 10:23:27   作者:編程小程  
本文主要介紹了淺談C++不同繼承之間的關(guān)系,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

公有繼承:“是一個(gè)” 的關(guān)系

派生類與基類:

賦值兼容規(guī)則

C++面向?qū)ο缶幊讨幸粭l重要的規(guī)則是:公有繼承意味著 “是一個(gè)” 。一定要牢牢記住這條規(guī)則。在任何需要基類對(duì)象的地方都可以用公有派生類的對(duì)象來(lái)代替,這條規(guī)則稱賦值兼容規(guī)則。它包括

以下情況:

  • 派生類的對(duì)象可以賦值給基類的對(duì)象,這時(shí)是把派生類對(duì)象中從對(duì)應(yīng)基類中繼承來(lái)的隱藏對(duì)象賦值給基類對(duì)象。反過(guò)來(lái)不行,因?yàn)榕缮惖男鲁蓡T無(wú)值可賦。
  • 可以將一個(gè)派生類的對(duì)象的地址賦給其基類的指針變量,但只能通過(guò)這個(gè)指針訪問(wèn)派生類中由基類繼承來(lái)的隱藏對(duì)象,不能訪問(wèn)派生類中的新成員。同樣也不能反過(guò)來(lái)做。
  • 派生類對(duì)象可以初始化基類的引用。引用是別名,但這個(gè)別名只能包含派生類對(duì)象中的由基類繼承來(lái)的隱藏對(duì)象。

如下代碼示例:

class Object
{
public:
int value;
public:
Object(int x = 0) :value(x) {}
~Object() {}
void print(int x)
{
value = x;
cout << value << endl;
}
};
class Base : public Object
{
public:
int num;
public:
Base(int x = 0):Object(x),num(x+10) {}
};
int main()
{
Base base(10);
Object obja(0);
Object *op = &base;
Object &ob = base;
obja = base;
return 0;
}

繼承關(guān)系中的構(gòu)造函數(shù)與析構(gòu)函數(shù)

class Person
{
	int _id;
public:
	Person(int id) :_id(id)
	{
		cout << "Create Person " << this << endl;
	}
	~Person()
	{
		cout << "Destroy Person " << this << endl;
	}
};
 
class Student : public Person
{
	int _s_id;
 
public:
	Student(int id, int s, int n) :_s_id(s),  Person(id)
	{
		cout << "Create Student: " << this << endl;
	}
	~Student()
	{
		cout << "Destroy Student" << this << endl;
	}
};
int main()
{
	Student stud(90010, 202201, 23);
	return 0;
}

定義基類person,派生類student,當(dāng)在主函數(shù)中創(chuàng)建一個(gè)派生類對(duì)象時(shí),首先創(chuàng)建person對(duì)象,再創(chuàng)建student對(duì)象,析構(gòu)時(shí),先析構(gòu)派生類對(duì)象,再析構(gòu)基類對(duì)象

繼承關(guān)系中拷貝構(gòu)造函數(shù)

  • 程序設(shè)計(jì)者在基類和派生類中都沒(méi)有定義拷貝構(gòu)造函數(shù);C++編譯器將自動(dòng)產(chǎn)生按位拷貝的拷貝構(gòu)造函數(shù);在派生類的拷貝構(gòu)造函數(shù)的初始化表中,加入基類拷貝構(gòu)造函數(shù)的調(diào)用,是C++編譯器合成的代碼;
  • 程序設(shè)計(jì)者在基類中定義拷貝構(gòu)造函數(shù);而在派生類中沒(méi)有定義拷貝構(gòu)造函數(shù);C++編譯器將會(huì)在派生類中自動(dòng)產(chǎn)生按位拷貝的拷貝構(gòu)造函數(shù)。并合成代碼,調(diào)用(關(guān)聯(lián))基類的拷貝構(gòu)造函數(shù)。
  • 程序設(shè)計(jì)者在基類和派生類中都定義了拷貝構(gòu)造函數(shù);程序設(shè)計(jì)者在派生類中,沒(méi)有指定調(diào)用基類的拷貝構(gòu)造函數(shù)時(shí)。C++編譯器合成的代碼調(diào)用基類的缺省構(gòu)造函數(shù),如果基類中沒(méi)有缺省構(gòu)造函數(shù)。合成代碼失敗。
  • 程序設(shè)計(jì)者在基類中沒(méi)有定義拷貝構(gòu)造函數(shù)(C++編譯器將自動(dòng)產(chǎn)生按位拷貝的拷貝構(gòu)造函數(shù))。而在派生類中定義了拷貝構(gòu)造函數(shù)。程序設(shè)計(jì)者在派生類中,沒(méi)有指定調(diào)用基類的拷貝構(gòu)造函數(shù)時(shí)。C++編譯器合成的代碼調(diào)用基類的缺省構(gòu)造函數(shù),如果基類中沒(méi)有缺省構(gòu)造函數(shù)。

繼承關(guān)系中賦值運(yùn)算符的重載

  • 程序設(shè)計(jì)者在基類和派生類中都沒(méi)有重載operator=函數(shù); C++編譯器將在基類和派生類中自動(dòng)產(chǎn)生按位賦值的,重載operator=函數(shù);C++編譯器會(huì)在派生類的重載賦值函數(shù)中,加入基類重載賦值函數(shù)的調(diào)用,是C++編譯器合成的代碼;(完成行為的統(tǒng)一);
  • 程序設(shè)計(jì)者在基類中定義重載賦值函數(shù);而在派生類中沒(méi)有定義重載賦值函數(shù);C++編譯器將會(huì)在派生類中自動(dòng)產(chǎn)生按位賦值的重載賦值函數(shù)。并合成代碼,調(diào)用(關(guān)聯(lián))基類的重載賦值函數(shù)。
  • 程序設(shè)計(jì)者在基類和派生類中都定義了重載賦值函數(shù);程序設(shè)計(jì)者在派生類中,沒(méi)有指定調(diào)用基類的重載賦值函數(shù)時(shí)。C++編譯器不會(huì)合成調(diào)用基類的重載賦值函數(shù)的代碼。要在派生類的重載賦值函數(shù)調(diào)用基類的重載賦值函數(shù),程序設(shè)計(jì)者必須自己加入調(diào)用代碼。
  • 程序設(shè)計(jì)者在基類中沒(méi)有定義重載賦值函數(shù)(C++編譯器將自動(dòng)產(chǎn)生按位賦值的重載賦值函數(shù)。而在派生類中定義了重載賦值函數(shù)。程序設(shè)計(jì)者在派生類中,沒(méi)有指定調(diào)用基類的重載賦值函數(shù)。C++編譯器不會(huì)合成調(diào)用基類的重載賦值函數(shù)的代碼。

通過(guò)組合體現(xiàn) “有一個(gè)” 或 “用…來(lái)實(shí)現(xiàn)”

使某個(gè)類的對(duì)象成為另一個(gè)類的數(shù)據(jù)成員,從而實(shí)現(xiàn)將一個(gè)類構(gòu)筑在另一個(gè)類之上,這一過(guò)程稱為

"組合“,分層;

組合

通過(guò)組合來(lái)體現(xiàn) “有一個(gè)” 或 “用…來(lái)實(shí)現(xiàn)”。
例如,“汽車有一個(gè)發(fā)動(dòng)機(jī) 或 汽車用發(fā)動(dòng)機(jī)來(lái)實(shí)現(xiàn) ” (has-a) 關(guān)系可以用單一組合表示為:

class Engine // 發(fā)動(dòng)機(jī)
{
private:
int cylinderNum; // 氣缸數(shù)
public:
Engine(int n = 4) :cylinderNum(n) {}
void Start(); // 啟動(dòng)
};
class Car
{
private:
Engine eg;
public:
Car():eg(8) {}
void StartCar();
};

**組合關(guān)系:**通過(guò)組合體現(xiàn) “有一個(gè)” 或 “用…來(lái)實(shí)現(xiàn)”。組合是一種耦合度更強(qiáng)的關(guān)聯(lián)關(guān)系。存在組合關(guān)系的類表示“整體-部分”的關(guān)聯(lián)關(guān)系,“整體”負(fù)責(zé)“部分”的生命周期,他們之間是共生共死的;并且“部分”單獨(dú)存在時(shí)沒(méi)有任何意義。

同樣的“有一個(gè)”關(guān)系也能用私有繼承表示:

class Engine // 發(fā)動(dòng)機(jī)
{
private:
int cylinderNum; // 氣缸數(shù)
public:
Engine(int n = 4) :cylinderNum(n) {}
void EnStart(); // 啟動(dòng)
};
class Door
{
private:
int doorNum;
public:
Door(int n = 5) :doorNum(n) {}
}
class Car : private Engine
{
public:
Car() :Engine(8) {}
void StartCar(); //通過(guò)發(fā)動(dòng)引擎來(lái)發(fā)動(dòng)這輛汽車
};

私有繼承: 要表示類之間 “用…來(lái)實(shí)現(xiàn)” 的關(guān)系,可以選擇是通過(guò)私有繼承實(shí)現(xiàn)?,F(xiàn)在這種情況下,這一技術(shù)就比分層更有優(yōu)勢(shì),因?yàn)橥ㄟ^(guò)它可以讓你告訴別人:Engine使用起來(lái)不安全,它只能用來(lái)實(shí)現(xiàn)其它的類

**聚合關(guān)系:**通過(guò)聚合體現(xiàn) “有一個(gè)” 或 “用…來(lái)實(shí)現(xiàn)”。 整體類與局部類之間松耦合,相互獨(dú)立。

class Engine // 發(fā)動(dòng)機(jī)
{
private:
int cylinderNum; // 氣缸數(shù)
public:
Engine(int n = 4) :cylinderNum(n) {}
void Start(); // 啟動(dòng)
};
class Car
{
private:
Engine *peg;
public:
Car():peg(nullptr) {}
void SetEngine(Engine *p) { peg = p;}
void StartCar();
};

總結(jié)

公有繼承與組合的區(qū)別

繼承與組合都是面向?qū)ο笾写a復(fù)用的方式。

公有繼承: 父類的內(nèi)部細(xì)節(jié)對(duì)子類可見(jiàn),其代碼屬于白盒式的復(fù)用;
例如: class Person ; class Student;

公有繼承的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 支持?jǐn)U展,通過(guò)繼承父類,可以設(shè)計(jì)較為復(fù)雜的系統(tǒng),體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)識(shí)過(guò)程。
  • 易于修改被復(fù)用的代碼。

缺點(diǎn):

  • 代碼白盒復(fù)用,父類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類,破壞了封裝性。
  • 當(dāng)父類的實(shí)現(xiàn)代碼修改時(shí),可能使得子類也不得不修改,增加維護(hù)難度。
  • 子類缺乏獨(dú)立性,依賴于父類,耦合度較高。
  • 不支持動(dòng)態(tài)拓展,在編譯期就決定了父類。

組合和私有繼承

**組合:**意味著 “用…來(lái)實(shí)現(xiàn)”; 對(duì)象之間的內(nèi)部細(xì)節(jié)不可見(jiàn),其代碼屬于黑盒式復(fù)用。
私有繼承意味著 “用…來(lái)實(shí)現(xiàn)”; 是組合關(guān)系,父類的內(nèi)部細(xì)節(jié)對(duì)子類不可見(jiàn),其代碼屬于黑盒式復(fù)用。

優(yōu)點(diǎn):

  • 代碼黑盒復(fù)用,被包括的對(duì)象內(nèi)部實(shí)現(xiàn)細(xì)節(jié)對(duì)外不可見(jiàn),封裝性好。
  • 整體類與局部類之間松耦合,相互獨(dú)立。
  • 支持?jǐn)U展每個(gè)類只專注于一項(xiàng)任務(wù)
  • 支持動(dòng)態(tài)擴(kuò)展,可在運(yùn)行時(shí)根據(jù)具體對(duì)象選擇不同類型的組合對(duì)象(擴(kuò)展性比繼承好)。

缺點(diǎn):

  • 創(chuàng)建整體類對(duì)象時(shí),需要?jiǎng)?chuàng)建所有局部類對(duì)象。導(dǎo)致系統(tǒng)對(duì)象很多。

公有繼承與私有繼承和組合如何選擇?

在對(duì)象分析時(shí)明確具有是一個(gè)(is - a) 的關(guān)系,使用公有繼承。
在對(duì)象分析時(shí)明確具有 “有一個(gè)” 或 "用…來(lái)實(shí)現(xiàn)"關(guān)系,使用組合和私有繼承。

私有繼承和組合如何選擇?

答案很簡(jiǎn)單:盡可能地使用組合,必須時(shí)才使用私有繼承。什么時(shí)候必須呢?這往往是指有保護(hù)成員
和/或虛函數(shù)介入的時(shí)候考慮考慮使用私有繼承。
//私有繼承在編碼過(guò)程中就要指定具體的父類,其關(guān)系在編譯期就確定,而組合的關(guān)系一般在運(yùn)行時(shí)確定。

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

您可能感興趣的文章:

相關(guān)文章

  • C++內(nèi)存管理詳細(xì)解析

    C++內(nèi)存管理詳細(xì)解析

    這篇文章主要給大家分享的是C++內(nèi)存管理的詳細(xì)內(nèi)容學(xué)習(xí),下面文章圍繞C++內(nèi)存管理的相關(guān)資料展開(kāi)具體學(xué)習(xí)內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • C++深入講解類與封裝的概念與使用

    C++深入講解類與封裝的概念與使用

    我們都知道C++有三大特性:封裝、繼承、多態(tài),現(xiàn)在我們來(lái)總結(jié)一下封裝的相關(guān)知識(shí)與類的概念,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-04-04
  • C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)

    C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)

    根據(jù)用于分配內(nèi)存的方法,C++中有3中管理數(shù)據(jù)內(nèi)存的方式:自動(dòng)存儲(chǔ)、靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)。在存在時(shí)間的長(zhǎng)短方面,以這三種方式分配的數(shù)據(jù)對(duì)象各不相同。下面簡(jiǎn)要介紹這三種類型
    2022-09-09
  • 深入C++中struct與class的區(qū)別分析

    深入C++中struct與class的區(qū)別分析

    本篇文章是對(duì)C++中struct與class的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C語(yǔ)言正確使用extern關(guān)鍵字

    詳解C語(yǔ)言正確使用extern關(guān)鍵字

    這篇文章主要介紹了C語(yǔ)言正確使用extern關(guān)鍵字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++解析特殊符號(hào)tab、換行符號(hào)實(shí)例代碼

    C++解析特殊符號(hào)tab、換行符號(hào)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于C++解析特殊符號(hào)tab、換行符號(hào)的相關(guān)資料,這個(gè)功能在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到,需要的朋友可以參考下
    2021-05-05
  • visual studio 2019編譯c++17的方法

    visual studio 2019編譯c++17的方法

    這篇文章主要介紹了visual studio 2019編譯c++17的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語(yǔ)言實(shí)現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)

    C語(yǔ)言實(shí)現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)

    這篇文章主要介紹了 C語(yǔ)言 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 探討:用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(我作為面試官的小結(jié))

    探討:用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(我作為面試官的小結(jié))

    作為面試官的我,經(jīng)常拿這道用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的面試題來(lái)考面試者,通過(guò)對(duì)面試者的表現(xiàn)和反應(yīng),有一些統(tǒng)計(jì)和感受,在此做個(gè)小結(jié)
    2013-05-05
  • QT使用Http協(xié)議通信的實(shí)現(xiàn)示例

    QT使用Http協(xié)議通信的實(shí)現(xiàn)示例

    使用QT進(jìn)行應(yīng)用開(kāi)發(fā)時(shí),有時(shí)候需要進(jìn)行客戶端和服務(wù)端的網(wǎng)絡(luò)通信,本文主要介紹了QT使用Http協(xié)議通信的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12

最新評(píng)論