亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中繼承的示例分析

發布時間:2021-08-22 18:19:50 來源:億速云 閱讀:150 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關C++中繼承的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1.繼承的概念及定義

1.1繼承的概念

繼承機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生新的類,稱派生類。繼承呈現了面向對象程序設計的層次結構,體現了由簡單到復雜的認知過程。以前我們接觸的復用都是函數復用,繼承是類設計層次的復用。

1.2繼承的定義格式

C++中繼承的示例分析

1.3繼承基類成員訪問方式的變化

C++中繼承的示例分析

(1)公有繼承

基類的公有成員,子類可以繼承為自己的公有成員。在派生類可以訪問,在外部也可以訪問。

基類的保護成員,子類可以繼承為自己的保護成員,在派生類可以訪問,在外部不可以訪問。

基類的私有成員,子類不可以訪問基類的私有成員。

(2)保護繼承

基類公有成員,子類中繼承為自己的保護成員,在派生類可以訪問,在外部不可以訪問。

基類保護成員,子類中繼承為自己的保護成員,在派生類可以訪問,在外部不可以訪問。

基類私有成員,子類不可以訪問基類的私有成員。

(3)私有繼承

基類公有成員,子類中繼承為自己的私有成員,在派生類可以訪問,在外部不可以訪問。

基類保護成員,子類中繼承為自己的私有成員,在派生類可以訪問,在外部不可以訪問。

基類私有成員,子類不可以訪問基類的私有成員。

1.4總結

C++中繼承的示例分析

(1)基類private成員任何方式繼承在派生類中都是不可見的。不可見指派生類對象不能去訪問它,但是基類的私有成員還是被繼承到了派生類對象中。

(2)基類的public成員和protected成員任何繼承方式在派生類都可以訪問。

(3)基類pretected成員,派生類可以訪問,類外不能訪問。

(4)基類的其他成員在子類的訪問方式 == Min(成員在基類的訪問限定符,繼承方式)。public > protected > private。

(5)使用關鍵字class時默認的繼承方式是private,使用struct時默認的繼承方式是public,不過最好顯示的寫出繼承方式。

class Derived : public Base   //指明繼承方式是public
class Derived : Base          //沒寫的情況下是private
struct Derived : Base         //沒寫的情況下是public

(6)在實際運用中一般使用都是public繼承,幾乎很少使用protetced/private繼承,實際中
擴展維護性不強。

2.基類和派生類對象賦值轉換

派生類對象可以賦值給基類的對象 / 基類的指針 / 基類的引用。

基類對象不能賦值給派生類對象

基類的指針可以通過強制類型轉換賦值給派生類的指針。但是必須是基類的指針是指向派生類對象時才是安全的。

class Person //基類/父類
{
protected :
	string _name; // 姓名
	string _sex; // 性別
	int _age; // 年齡
};
class Student : public Person  //派生類/子類
{
public :
	int _No ; // 學號
};
void Test ()
{
	Student sobj ;  //創建子類對象sobj
	// 1.子類對象可以賦值給父類對象/指針/引用
	Person pobj = sobj ;
	Person* pp = &sobj;
	Person& rp = sobj;
	//2.基類對象不能賦值給派生類對象
	sobj = pobj;  //錯誤
	// 3.基類的指針可以通過強制類型轉換賦值給派生類的指針
	pp = &sobj
	Student* ps1 = (Student*)pp; // 這種情況轉換時可以的。
	ps1->_No = 10;
	pp = &pobj;
	Student* ps2 = (Student*)pp; // 這種情況轉換時雖然可以,但是會存在越界訪問的問題
	ps2->_No = 10;
}

3.繼承中的作用域

在繼承體系中基類和派生類都有獨立的作用域。

子類和父類中有同名成員,子類成員將屏蔽父類對同名成員的直接訪問,這種情況叫隱藏,也叫重定義。(在子類成員函數中,可以使用 基類::基類成員 顯示訪問)

需要注意的是如果是成員函數的隱藏,只需要函數名相同就構成隱藏。

注意在實際中在繼承體系里面最好不要定義同名的成員。

// B中的fun和A中的fun不是構成重載,因為不是在同一作用域
// B中的fun和A中的fun構成隱藏,成員函數滿足函數名相同就構成隱藏。
class A  //基類
{
public:
	void fun()
	{
		cout << "func()" << endl;
	}
};
class B : public A  //派生類
{
public:
	void fun(int i)
	{
		A::fun();
		cout << "func(int i)->" <<i<<endl;
	}
};
void Test()
{
	B b;
	b.fun(10);
};
//如果通過子類對象調用相同名稱的成員時,優先訪問子類的,基類同名的成員永遠無法通過
// 子類對象直接調用到,相當于子類同名成員將基類的同名成員隱藏了
// 如果想要同名子類對象訪問基類中同名的成員,只需在成員前加上基類名稱::
// 如果在子類成員函數中,想要訪問基類同名的成員,只需在基類成員前加上基類名稱::
class Base  //基類
{
public:
	void SetBase(int b)
	{
		_b = b;
	}
	void fun()
	{
		cout << "Base::fun()" << endl;
	}
public:
	int _b;
	char _c;
};
class Derived : public Base  //派生類
{
public:
	void SetDeirved(int b, int d)
	{
		_c = 100;
		Base::_c = 100;  //如果在子類成員函數中,想要訪問基類同名的成員,只需在基類成員前加上基類名稱::
		__super::_c = 100;
		SetBase(b);
		_d = d;
	}
	void fun(int a)
	{
		cout << "Derived::fun(int)" << endl;
	}
public:
	int _d;
	int _c;
};

int main()
{
	Base b;
	b.SetBase(10);
	Derived d;
	d.SetDeirved(100, 200);
	/*
	如果子類和基類中具有相同名稱的成員變量時,不管成員變量的類型是否相同,
	都優先訪問子類的同名成員變量
	不能通過子類對象直接訪問子類和父類中同名的成員變量,就相當與子類同名的成員變量將基類的同名成員變量隱藏了
	*/
	d._c = 'A';   // d對象中有兩個_c
	// 有些情況下可能需要通過子類對象訪問基類中同名的成員變量
	d.Base::_c = 'B';

	// d.fun();   // 編譯報錯
	d.fun(10);
	d.Base::fun(); //如果想要同名子類對象訪問基類中同名的成員,只需在成員前加上基類名稱::
	return 0;
}

關于“C++中繼承的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

石屏县| 石嘴山市| 乌什县| 板桥市| 罗田县| 长丰县| 墨江| 聊城市| 元江| 常宁市| 武胜县| 涞源县| 洪江市| 迭部县| 额尔古纳市| 拉萨市| 麻栗坡县| 象山县| 望都县| 本溪市| 乃东县| 美姑县| 奇台县| 佳木斯市| 观塘区| 门源| 柞水县| 武威市| 文成县| 霍山县| 大邑县| 抚远县| 巴中市| 霸州市| 威宁| 灵川县| 道真| 兴和县| 綦江县| 普兰县| 昭苏县|