成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C++類(lèi)的繼承

  在C++中,可重用性是通過(guò)繼承這一機(jī)制來(lái)實(shí)現(xiàn)的,因此,繼承是C++中一個(gè)重要的部分。

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的利辛網(wǎng)站建設(shè)公司,利辛接單;提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行利辛網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

1.派生類(lèi)的聲明

聲明一個(gè)派生類(lèi)的一般格式為:

class 派生類(lèi)名:繼承方式  基類(lèi)名
{
    //派生類(lèi)新增的數(shù)據(jù)成員和成員函數(shù)
};

 從已有類(lèi)派生出新類(lèi)時(shí),可以在派生類(lèi)內(nèi)完成以下功能:

  (1)可以增加新的數(shù)據(jù)成員

  (2)可以增加新的成員函數(shù)

  (3)可以對(duì)基類(lèi)的成員進(jìn)行重定義

  (4)可以改變基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性

2.基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性

  從基類(lèi)繼承來(lái)的成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性是由繼承方式控制的,下面我們來(lái)看看類(lèi)的繼承方式。

 類(lèi)的繼承方式有public(公有繼承),protected(保護(hù)繼承),private(私有繼承)3種,不同的繼承方式導(dǎo)致不同訪(fǎng)問(wèn)屬性的基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性也不同。

(1)公有繼承的訪(fǎng)問(wèn)規(guī)則

基類(lèi)成員私有成員公有成員保護(hù)成員
類(lèi)內(nèi)訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)
對(duì)象訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)

(2)保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則

基類(lèi)成員私有成員公有成員保護(hù)成員
類(lèi)內(nèi)訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)
對(duì)象訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)

(3)私有繼承的訪(fǎng)問(wèn)規(guī)則

基類(lèi)成員私有成員公有成員保護(hù)成員
類(lèi)內(nèi)訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)可訪(fǎng)問(wèn)
對(duì)象訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)不可訪(fǎng)問(wèn)

根據(jù)上面三個(gè)表格我們不難看出:

a.基類(lèi)中的私有成員:

 無(wú)論哪種繼承方式,都不允許派生類(lèi)繼承,即在派生類(lèi)中是不可以直接訪(fǎng)問(wèn)的。

b.基類(lèi)中的公有成員:

 公有繼承時(shí),基類(lèi)中的所有公有成員在派生類(lèi)中仍以公有成員的身份出現(xiàn)

 私有繼承時(shí),基類(lèi)中的所有公有成員在派生類(lèi)中都是以私有成員的身份出現(xiàn)

 保護(hù)繼承時(shí),基類(lèi)中的所有公有成員在派生類(lèi)中都是以保護(hù)成員的身份出現(xiàn)

c.基類(lèi)中的保護(hù)成員:

 公有繼承時(shí),基類(lèi)中的所有公有成員在派生類(lèi)中仍以保護(hù)成員的身份出現(xiàn)

 私有繼承時(shí),基類(lèi)中的所有公有成員在派生類(lèi)中都是以私有成員的身份出現(xiàn)

 保護(hù)繼承時(shí),基類(lèi)中的所有公有成員在派生類(lèi)中都是以保護(hù)成員的身份出現(xiàn)

下面我們通過(guò)實(shí)例來(lái)看看公有繼承:

#include<iostream>

using namespace std;

class B
{
public:
	void geta(int a1)
	{
		a = a1;
	}
	void showa()
	{
		cout << "a=" << a << endl;
	}
private:
	int a;
};

class D :public B
{
public:
	void getab(int a1, int b1)
	{
		geta(a1);
		b = b1;
	}
	void showab()
	{
		cout << "a=" << a << endl;//錯(cuò)誤,a在類(lèi)中為不可直接訪(fǎng)問(wèn)成員
		cout << "b=" << b << endl;
	}
private:
	int b;
};

void Funtest()
{
	D d;
	d.getab(10, 24);
	d.showa();
	d.showab();
}

int main()
{
	Funtest();
	system("pause");
	return 0;
}

上面程序中在D內(nèi)訪(fǎng)問(wèn)了a是錯(cuò)誤的,在這里再次說(shuō)明:派生類(lèi)公有繼承了基類(lèi),但是不代表派生類(lèi)可以訪(fǎng)問(wèn)基類(lèi)私有成員,企圖訪(fǎng)問(wèn)是非法的。

3.派生類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù):

我們先通過(guò)一個(gè)例子來(lái)看看派生類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序吧:

#include<iostream>

using namespace std;

class B
{
public:
	B(int n)
	{
		cout << "B()" << endl;
		i = n;
	}
	~B()
	{
		cout << "~B()" << endl;
	}
	void showi()
	{
		cout << i << endl;
	}
private:
	int i;
};

class D :public B
{
public:
	D(int n, int m) :B(m)
	{
		cout << "D()" << endl;
		j = n;
	}
	~D()
	{
		cout << "~D()" << endl;
	}
	void showj()
	{
		cout << j << endl;
	}
private:
	int j;
};

void Funtest()
{
	D d(50, 60);
	d.showi();
	d.showj();
}

int main()
{
	Funtest();
	system("pause");
	return 0;
}

大家分析一下這段代碼的結(jié)果是什么呢?

C++ 類(lèi)的繼承

從結(jié)果中可以看到:

 當(dāng)創(chuàng)建派生類(lèi)對(duì)象時(shí),首先調(diào)用基類(lèi)的構(gòu)造函數(shù),然后再調(diào)用派生類(lèi)的構(gòu)造函數(shù),當(dāng)撤銷(xiāo)派生類(lèi)對(duì)象時(shí),則先調(diào)用派生類(lèi)的析構(gòu)函數(shù),隨后調(diào)用基類(lèi)的析構(gòu)函數(shù)。

那么為什么調(diào)用析構(gòu)函數(shù)時(shí)順序是相反的呢?

 對(duì)于析構(gòu)函數(shù)來(lái)說(shuō),基類(lèi)的構(gòu)造函數(shù)并不了解子類(lèi)的結(jié)構(gòu),所以子類(lèi)必須先于基類(lèi)完成清理工作,一步一步向上推進(jìn)。


4.派生類(lèi)的構(gòu)造函數(shù)與析構(gòu)函數(shù)

 在上面的程序中我們可以看到派生類(lèi)內(nèi)有自定義的構(gòu)造函數(shù),并且?guī)Я藚?shù)。派生類(lèi)不能繼承基類(lèi)中的構(gòu)造函數(shù)和析構(gòu)函數(shù)。當(dāng)基類(lèi)含有帶參數(shù)的構(gòu)造函數(shù)時(shí),派生類(lèi)必須定義構(gòu)造函數(shù),以提供把參數(shù)傳遞給基類(lèi)構(gòu)造函數(shù)的途徑。

C++中,派生類(lèi)構(gòu)造函數(shù)的一般格式為:

派生類(lèi)名(參數(shù)總表):基類(lèi)名(參數(shù)表)

{

   //派生類(lèi)新增數(shù)據(jù)成員的初始化語(yǔ)句

}

基類(lèi)構(gòu)造函數(shù)的參數(shù)通常來(lái)源于派生類(lèi)構(gòu)造函數(shù)的參數(shù)總表

說(shuō)明:

(1)基類(lèi)沒(méi)有缺省的構(gòu)造函數(shù),派生類(lèi)必須要在初始化列表中顯式給出基類(lèi)名和參數(shù)列表

(2)基類(lèi)沒(méi)有定義構(gòu)造函數(shù),則派生類(lèi)也可以不用定義,全部使用缺省構(gòu)造函數(shù)

(3)基類(lèi)定義了帶有形參表的構(gòu)造函數(shù),派生類(lèi)就一定定義構(gòu)造函數(shù)(可以看上面那段程序幫助理解哦)

5.繼承體系中的作用域

(1)在繼承體系中基類(lèi)和派生類(lèi)是兩個(gè)不同的作用域(這也是為什么基類(lèi)的私有成員無(wú)論被哪種方式繼承時(shí)都不可以在派生類(lèi)中直接訪(fǎng)問(wèn)的原因)

(2)派生類(lèi)和基類(lèi)中有同名成員時(shí),派生類(lèi)成員將屏蔽基類(lèi)對(duì)成員的直接訪(fǎng)問(wèn)。在派生類(lèi)成員函數(shù)中,可通過(guò)下面這種方式訪(fǎng)問(wèn):

              基類(lèi)::基類(lèi)成員

(3)當(dāng)然,在實(shí)際中,我們最好不要使用同名成員來(lái)定義對(duì)象

6.賦值兼容規(guī)則:

(1)子類(lèi)對(duì)象賦值給父類(lèi)對(duì)象:

Base b;
Derived d;
b=d;

(2)子類(lèi)對(duì)象可初始化父類(lèi)對(duì)象的引用:

B &br = d;

(3)父類(lèi)指針可以指向子類(lèi)對(duì)象:

B *pb = &d;

(4)若函數(shù)形參為父類(lèi)對(duì)象或?qū)ο蟮囊脮r(shí),調(diào)用函數(shù)時(shí)可以用子類(lèi)對(duì)象作實(shí)參

class B
{
  public:
     int i;
     //……
};

class D:public B
{ };
 
void fun(B &bb)
{
  cout<<bb.i<<endl;
}
在調(diào)用函數(shù)fun()時(shí)可以用子類(lèi)的對(duì)象d作為實(shí)參。輸出子類(lèi)D的對(duì)象d賦給父類(lèi)的數(shù)據(jù)成員i的值。

7.友元與繼承

友元關(guān)系不能繼承,即基類(lèi)友元不能訪(fǎng)問(wèn)派生類(lèi)私有和保護(hù)成員

8.單繼承、多繼承、菱形繼承、

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

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

  多重繼承的一般形式為:
   class類(lèi)名l:訪(fǎng)問(wèn)控制類(lèi)名2,訪(fǎng)問(wèn)控制類(lèi)名3,…訪(fǎng)問(wèn)控制類(lèi)名n
   (
   …//定義派生類(lèi)自己的成員
   };

多繼承構(gòu)造函數(shù)的調(diào)用順序與單繼承構(gòu)造函數(shù)的調(diào)用順序相同,也是遵循先調(diào)用基類(lèi)的構(gòu)造函數(shù),再調(diào)用對(duì)象成員的構(gòu)造函數(shù),最后調(diào)用派生類(lèi)構(gòu)造函數(shù)的原則。

(3)菱形繼承

例如,B為類(lèi)C1、C2的直接父類(lèi),C1、C2又同時(shí)是D的父類(lèi)。

因?yàn)榱庑卫^承存在二義性和數(shù)據(jù)冗余的問(wèn)題,所以引出了下面的虛擬繼承


9.虛擬繼承

  虛擬繼承是多重繼承中特有的概念。虛擬基類(lèi)是為解決多重繼承而出現(xiàn)的。如:類(lèi)D繼承自類(lèi)C1、C2,而類(lèi)C1、C2都繼承自類(lèi)B,因此在類(lèi)D中兩次出現(xiàn)類(lèi)B中的變量和函數(shù)。為了節(jié)省內(nèi)存空間,可以將C1、C2對(duì)B的繼承定義為虛擬繼承,而B(niǎo)就成了虛擬基類(lèi)。

 虛基類(lèi)的聲明:

class 派生類(lèi)名:virtual繼承方式 類(lèi)名

{

 // ……

}


說(shuō)明:關(guān)鍵字virtual與繼承方式關(guān)鍵字的先后順序無(wú)關(guān),它只是說(shuō)明是“虛擬繼承”。


下面我們通過(guò)例子來(lái)深度理解一下虛擬繼承是怎么一回事:

#include<iostream>
using namespace std;

class B
{
public:
	B()
	{
		a = 1;
		cout << "B a = " << a << endl;
	}
protected:
	int a;
};

class B1 :public B
{
public:
	B1()
	{
		a += 10;
		cout << "B1 a = " << a << endl;
	}
};

class B2 :public B
{
public:
	B2()
	{
		a += 20;
		cout << "B2 a = " << a << endl;
	}
};

class D :public B1, public B2
{
public:
	D()
	{
		cout << "B1::a = " << B1::a << endl;
		cout << "B2::a = " << B2::a << endl;
	}
};

void Funtest()
{
	D d;
}

int main()
{
	Funtest();
	system("pause");
	return 0;
}

程序運(yùn)行結(jié)果如下:

C++ 類(lèi)的繼承

由于在類(lèi)D中同時(shí)存在著類(lèi)B1、B2的數(shù)據(jù)成員a,因此在D中的構(gòu)造函數(shù)中輸出a時(shí)必須加上“類(lèi)名::”,指出是哪一個(gè)數(shù)據(jù)成員a,否則就會(huì)出現(xiàn)二義性。如果將上面的子類(lèi)D改成下面形式便會(huì)出錯(cuò):

class D :public B1, public B2
{
public:
	D()
	{
		cout << "D a = " << a << endl;//錯(cuò)誤
	}
};

下面使用關(guān)鍵字來(lái)看這個(gè)程序:

#include<iostream>
using namespace std;

class B
{
public:
	B()
	{
		a = 1;
		cout << "B a = " << a << endl;
	}
protected:
	int a;
};

class B1 : virtual public B
{
public:
	B1()
	{
		a += 10;
		cout << "B1 a = " << a << endl;
	}
};

class B2 :virtual public B
{
public:
	B2()
	{
		a += 20;
		cout << "B2 a = " << a << endl;
	}
};

class D :public B1, public B2
{
public:
	D()
	{
		cout << "D a = " << a << endl;

		//cout << "B1::a = " << B1::a << endl;
		//cout << "B2::a = " << B2::a << endl;
	}
};

void Funtest()
{
	D d;
}

int main()
{
	Funtest();
	system("pause");
	return 0;
}

程序結(jié)果運(yùn)行如下:

C++ 類(lèi)的繼承C++ 類(lèi)的繼承

上述程序中使用了關(guān)鍵字,這樣的話(huà),從B1、B2派生出的類(lèi)D指繼承基類(lèi)B一次,就是說(shuō)基類(lèi)B的數(shù)據(jù)成員a只保留一份。

虛擬繼承解決了在菱形繼承體系里面子類(lèi)對(duì)象包含多份父類(lèi)對(duì)象的數(shù)據(jù)冗余和空間浪費(fèi)的問(wèn)題。

這是我對(duì)于繼承的理解,如有不足,還請(qǐng)各位多多指教

新聞標(biāo)題:C++類(lèi)的繼承
當(dāng)前地址:http://jinyejixie.com/article32/igodsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、ChatGPT、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)、標(biāo)簽優(yōu)化、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
石河子市| 伽师县| 阳信县| 台州市| 太白县| 额敏县| 眉山市| 郑州市| 富宁县| 安陆市| 安徽省| 额尔古纳市| 贺州市| 读书| 澄迈县| 安福县| 屯门区| 安徽省| 策勒县| 陆川县| 临潭县| 曲沃县| 安图县| 永康市| 漳州市| 凌云县| 海丰县| 安岳县| 错那县| 明星| 涿州市| 方正县| 宣化县| 鄂尔多斯市| 祁阳县| 鹤峰县| 通河县| 呼图壁县| 海口市| 舒城县| 杂多县|