中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

單頁(yè)網(wǎng)站設(shè)計(jì)最近一個(gè)月的熱點(diǎn)事件

單頁(yè)網(wǎng)站設(shè)計(jì),最近一個(gè)月的熱點(diǎn)事件,網(wǎng)站建設(shè)方案書(shū)設(shè)計(jì)圖,梅林固件做網(wǎng)站文章目錄 🦜1. 什么是繼承🐊1.1 概念🐊1.2 格式🐊1.3 繼承方式 & 訪問(wèn)限定符 🐦2. 派生類和基類的賦值問(wèn)題🦩3. 派生類和基類同名成員問(wèn)題🐓4.派生類默認(rèn)成員函數(shù)🐉4.1 構(gòu)造函數(shù)…

在這里插入圖片描述

文章目錄

  • 🦜1. 什么是繼承
    • 🐊1.1 概念
    • 🐊1.2 格式
    • 🐊1.3 繼承方式 & 訪問(wèn)限定符
  • 🐦2. 派生類和基類的賦值問(wèn)題
  • 🦩3. 派生類和基類同名成員問(wèn)題
  • 🐓4.派生類默認(rèn)成員函數(shù)
    • 🐉4.1 構(gòu)造函數(shù)
    • 🐉4.2 拷貝構(gòu)造
    • 🐉4.3 賦值運(yùn)算符重載
    • 🐉4.4 析構(gòu)函數(shù)
  • 🐥5. 友元和靜態(tài)成員
  • 🐧6. 多繼承

🦜1. 什么是繼承

🐊1.1 概念

在現(xiàn)實(shí)生活中,談起繼承,就會(huì)聯(lián)想到繼承家業(yè)、家產(chǎn)。

而在編程世界中,繼承也是如此,一個(gè)類(稱子類或者派生類),可以繼承另一個(gè)類(稱父類基類)的屬性和行為。

//定義一個(gè)人的屬性	基類
class Person
{
public:Person(string name = "Kangkang", string gender = "male", int age = 18):_name(name),_gender(gender),_age(age){cout << "Person()" << endl;}void Print(){cout << "name:" << _name << endl;cout << "gender:" << _gender << endl;cout << "age:" << _age << endl;}
protected:string _name;	//	姓名string _gender;	//	姓別int _age;	//年齡
};
//定義一個(gè)學(xué)生類,繼承人的屬性		子類
class Student :public Person
{
public:Student(string name = "Lihua", string gender = "female", int age = 20, int id=111):Person(name,gender,age),_stuId(id){};
protected:int _stuId;	//學(xué)號(hào)
};
int main()
{Person p;Student stu("Lisa","female",20,20230812);p.Print();stu.Print();return 0;
}

🐊1.2 格式

class 子類 : 繼承方式 基類
{};

image-20230813211527815

🐊1.3 繼承方式 & 訪問(wèn)限定符

image-20230813212440542

繼承方式public繼承protected繼承private繼承
父類public成員子類的public成員子類的protected成員子類的private成員
父類的protected成員子類的protected成員子類的protected成員子類的private成員
父類的private成員子類不可見(jiàn)子類不可見(jiàn)子類不可見(jiàn)

這里其實(shí)很好分辨,我們只需要取權(quán)限小的即可:public>protected>private

對(duì)于public成員,我們可以直接在類的外面訪問(wèn)調(diào)用,而對(duì)于protected成員,可在類里面通過(guò)this指針訪問(wèn),而private成員,雖然繼承到了派生類對(duì)象中,但無(wú)法訪問(wèn)到,也可以理解為將父類的成員設(shè)為private就是不想讓其他類繼承

image-20230813220139015

但是在實(shí)際應(yīng)用過(guò)程中,一般都是采用的public繼承方式

Tips:

關(guān)鍵字class不指定繼承方式時(shí),默認(rèn)繼承方式為private

而使用struct關(guān)鍵字時(shí),默認(rèn)繼承方式為public

但這里還是建議,每次都顯示繼承方式

class A
{
public:void func1() { cout << "func1()" << endl; }
protected:void func2(){ cout << "func2()" << endl; }
private:void func3(){ cout << "func3()" << endl; }int _a = 0;
};
class B :public A
{
public:void Print(){this->func1();this->func2();}int _b = 1;};
int main()
{B b;b.Print();
}

🐦2. 派生類和基類的賦值問(wèn)題

派生類和基類之間的賦值操作涉及到對(duì)象切片的問(wèn)題。派生類的對(duì)象可以賦值給基類對(duì)象/基類指針/基類引用 ,但反過(guò)來(lái)(將基類對(duì)象賦值給派生類對(duì)象)是不合法的,因?yàn)檫@可能導(dǎo)致對(duì)象切片,即派生類對(duì)象的額外成員信息丟失

image-20230813222919821

這就好比,學(xué)習(xí)C++,C++是在C語(yǔ)言的基礎(chǔ)上衍生出來(lái)的,可以理解問(wèn)C++繼承了C語(yǔ)言的衣缽,C++的代碼可以兼容C的代碼;反之,C的代碼卻不能卻不能兼容C++。

image-20230813223945086

🦩3. 派生類和基類同名成員問(wèn)題

class A
{
public:int _x=1;int _y=2;void Print(){cout << "A()" << endl;}
};
class B :public A
{
public:int _x = 3;int _y = 4;void Print(){cout << "B()" << endl;}
};
int main()
{B b;cout << b._x << endl;	// 3cout << b._y << endl;	// 4b.Print();	// B()
}

這段代碼基類A和派生類B,成員名都是相同的,但我們輸出發(fā)現(xiàn),輸出的是派生類的成員,那這里是否繼承了A的這些成員呢?

image-20230813225150530

通過(guò)監(jiān)視窗口發(fā)現(xiàn),這里A是被B繼承了,但是由于成員名相同,A被B給隱藏了,這也叫重定義

如果要訪問(wèn)基類的成員,可使用基類:基類成員顯示訪問(wèn),這也可理解問(wèn)他們都有著獨(dú)立的作用域

image-20230813225536058

🐓4.派生類默認(rèn)成員函數(shù)

🐉4.1 構(gòu)造函數(shù)

派生類的構(gòu)造函數(shù)必須調(diào)用基類的構(gòu)造函數(shù)來(lái)初始化繼承下來(lái)的那部分成員;如果基類沒(méi)有默認(rèn)構(gòu)造,那在派生類構(gòu)造函數(shù)的初始化列表顯示調(diào)用

class Person
{
public://全缺省,默認(rèn)構(gòu)造Person(string name = "Kangkang"):_name(name){}
protected:string _name;
};
class Student : public Person
{
public:Student(string name, int id):Person(name),_id(id){}void Print(){cout << "name:" << _name << endl;cout << "id:" << _id << endl;}
protected:int _id;
};
int main()
{Student stu("Lisa",2023);stu.Print();return 0;
}

🐉4.2 拷貝構(gòu)造

派生類的拷貝構(gòu)造函數(shù)必須調(diào)用基類的拷貝構(gòu)造完成基類的拷貝初始化,但我們可以直接傳子類對(duì)象,因?yàn)檎{(diào)用父類的拷貝構(gòu)造時(shí),父類會(huì)自動(dòng)切片拿到父類中的對(duì)象

父類拷貝構(gòu)造

Person(const Person& p):_name(p._name)
{}

子類拷貝構(gòu)造

Student(const Student&stu):Person(stu._name),_id(stu._id)
{}

調(diào)用

Student stu("Lisa", 2023);
stu.Print();
Student stu2(stu);
stu2.Print();

🐉4.3 賦值運(yùn)算符重載

子類的operator=必須要調(diào)用父類的operator=完成基類的復(fù)制;但是因?yàn)橘x值運(yùn)算符重載了=,那么子類和父類的名字都是一樣,這樣就造成了子類隱藏了父類的operator=。所以需要顯示調(diào)用父類的operator=

//operator=
Person& operator=(const Person& p)
{if (this != &p){_name = p._name;}return *this;
}
Student& operator=(Student& stu)
{if (this != &stu){//指定調(diào)用父類Person::operator =(stu);_id = stu._id;}return *this;
}

🐉4.4 析構(gòu)函數(shù)

子類的析構(gòu)函數(shù)會(huì)在被調(diào)用完成后自動(dòng)調(diào)用父類的析構(gòu)函數(shù)清理基類成員;因?yàn)檫@樣才能保證子類對(duì)象先清理子類成員再清理父類成員的順序。

Tips:

切記,這里是自動(dòng)調(diào)用父類的析構(gòu),所以我們不需要在子類的析構(gòu)函數(shù)中調(diào)用父類的析構(gòu)函數(shù)

如果這里有指針,同一塊區(qū)域釋放兩次,會(huì)造成未定義行為

🐥5. 友元和靜態(tài)成員

在繼承中,友元關(guān)系是不可以被繼承的,就好比咱們朋友的朋友,不一定是咱們的朋友。

對(duì)于靜態(tài)成員,這里繼承的是它的使用權(quán),就比如家里有三個(gè)孩子,一個(gè)大哥哥,兩個(gè)小弟弟,這個(gè)哥哥是他兩“共用的”,并不會(huì)說(shuō)2個(gè)弟弟必須有2個(gè)哥哥。

class A
{
public:static int _sa;int _a;
};
int A::_sa = 1;
class B :public A
{
public:int _b;
};int main()
{A a;B b;cout <<"a._a:" << &a._a << endl;cout <<"b._a:" << &b._a << endl;cout <<"a._sa:" << &A::_sa << endl;cout <<"b._sa:" << &B::_sa<< endl;
}

這里也可以驗(yàn)證,對(duì)于靜態(tài)成員,父類和子類是共用的(可用于計(jì)算父類有多少個(gè)派生類)。

🐧6. 多繼承

對(duì)于一個(gè)子類只有一個(gè)直接父類,這種關(guān)系稱為單繼承

//單繼承
class A
{};
class B:public A
{};
class C :public B
{};

而對(duì)于一個(gè)子類有多個(gè)直接父類,這種關(guān)系稱為多繼承

//多繼承
class A
{};
class B
{};
class C :public A, public B
{};

多繼承會(huì)引發(fā)一個(gè)很麻煩的問(wèn)題——菱形繼承

image-20230814002934232

我們先來(lái)上代碼

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._a = 1;	//errord._b = 2;return 0;
}

這段代碼,直接報(bào)錯(cuò),_a的指定不明確,因?yàn)镈類繼承了B類和C類,編譯器不知道這個(gè)_a是屬于繼承的哪個(gè)類,從而產(chǎn)生二義性的問(wèn)題。

image-20230814003431003

當(dāng)然,前面也提到過(guò),可以通過(guò)指定類域,來(lái)明確告訴編譯器,這屬于哪個(gè)類

D d;
d.B::_a = 1;
d.C::_a = 2;
d._b = 3;
d._c = 4;
d._d = 5;

這樣雖然解決了二義性的問(wèn)題,但是這樣看的數(shù)據(jù)十分冗余,很容易分不清哪個(gè)是哪個(gè)

image-20230814004447944

為了填補(bǔ)這個(gè)坑,推出了一種名為虛擬繼承的繼承方式(僅限菱形繼承使用,其他地方不要使用)

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._b = 3;d._c = 4;d._d = 5;d._a = 6;return 0;
}

使用虛擬繼承之后,我們發(fā)現(xiàn)這里的_a,只有一份了,而且我們查看內(nèi)存發(fā)現(xiàn),數(shù)據(jù)并不是連在一起,多了一些地址

image-20230814011531088

這叫做虛基表,用來(lái)尋找基類偏移量的表,虛擬繼承的派生類里面就包含了這個(gè)虛表,這個(gè)虛表記錄著距離基類的偏移量,如果要用到基類的數(shù)據(jù),加上這個(gè)距離就能找到,這樣就解決了數(shù)據(jù)的二義性和數(shù)據(jù)冗余的問(wèn)題。

但是在實(shí)際過(guò)程中,這個(gè)模型十分雞肋且復(fù)雜,所以一般都不會(huì)采用這種繼承方式。


多繼承就屬于C++語(yǔ)法復(fù)雜的一個(gè)體現(xiàn),而繼承雖然可以復(fù)用,但是繼承的耦合度十分高,代碼直接的依賴關(guān)系很強(qiáng),這樣就造成了代碼的不便于維護(hù)。但又涉及到多態(tài)必須使用繼承,所以在實(shí)際之中,代碼要復(fù)用的話,我們得分場(chǎng)景。
那本期的方向就到這咯,我們下期再見(jiàn),如果有下期的話。

http://www.risenshineclean.com/news/52193.html

相關(guān)文章:

  • 廣州網(wǎng)站建設(shè)360元陜西seo優(yōu)化
  • 公司做網(wǎng)站費(fèi)用會(huì)計(jì)分錄谷歌是如何運(yùn)營(yíng)的
  • 本地做網(wǎng)站貴seo搜索引擎優(yōu)化推廣
  • 網(wǎng)站開(kāi)發(fā)的前端語(yǔ)言是哪些品牌營(yíng)銷戰(zhàn)略
  • 找網(wǎng)站建設(shè)公司百度seo插件
  • 鄭州做網(wǎng)站推廣價(jià)格廣東網(wǎng)站se0優(yōu)化公司
  • 昆明做網(wǎng)站建設(shè)的公司全國(guó)疫情最新消息今天新增
  • 花都網(wǎng)站開(kāi)發(fā)公司百度新聞發(fā)布
  • h5制作開(kāi)發(fā)地點(diǎn)企業(yè)關(guān)鍵詞優(yōu)化價(jià)格
  • 網(wǎng)站索引量暴增什么叫軟文推廣
  • wordpress表單上傳多個(gè)文件濰坊關(guān)鍵詞優(yōu)化軟件
  • 做ui的圖從哪個(gè)網(wǎng)站找制作公司官網(wǎng)多少錢(qián)
  • 廣東東莞智通人才招聘網(wǎng)榆林市網(wǎng)站seo
  • 沈陽(yáng)做網(wǎng)站的地方百度推廣怎么賺錢(qián)
  • 深圳網(wǎng)站建設(shè)公司的英文名是網(wǎng)站seo分析工具
  • 做資源網(wǎng)站怎么不封今日新聞內(nèi)容
  • 利用對(duì)象儲(chǔ)存做網(wǎng)站友情鏈接免費(fèi)發(fā)布平臺(tái)
  • 網(wǎng)站展示型推廣北京網(wǎng)絡(luò)推廣有哪些公司
  • 給網(wǎng)站做壓力測(cè)試全國(guó)新冠疫苗接種率
  • 建站公司見(jiàn)客戶沒(méi)話說(shuō)b2b商務(wù)平臺(tái)
  • 衡水建網(wǎng)站百度搜索風(fēng)云排行榜
  • 網(wǎng)站商城如何獲取流量成都網(wǎng)絡(luò)營(yíng)銷推廣
  • 做行業(yè)分析的網(wǎng)站百度指數(shù)網(wǎng)址是什么
  • 論壇建站哪個(gè)比較好廣點(diǎn)通投放平臺(tái)
  • 谷歌瀏覽器怎么刪除2345網(wǎng)址導(dǎo)航百度產(chǎn)品優(yōu)化排名軟件
  • 免費(fèi)瀏覽的網(wǎng)站資源平臺(tái)
  • 簡(jiǎn)單做網(wǎng)站百度外鏈查詢工具
  • 廣安網(wǎng)站seoweb前端培訓(xùn)費(fèi)用大概多少
  • 企業(yè)所得稅一般交多少谷歌廣告優(yōu)化師
  • 什么是網(wǎng)站死鏈鄭州網(wǎng)絡(luò)推廣