嵌入式學習(十六)

由于C++的類沒學好脱衙。這是在另一個班學習的筆記

一、面向對象的三大特征

????封裝例驹、繼承和多態(tài)

二、類之間的繼承

【1】訪問權限

????public:類中退唠、子類和類外都可以訪問

????private:類中可以訪問鹃锈,類外和子類中都不能訪問

????protected:類中和子類可以訪問,類外不能訪問

【2】繼承

????繼承指的是瞧预,基于已有類屎债,創(chuàng)建出新類的過程。

????基類和派生類

????父類和子類

【3】繼承的作用

? ? ? 能提高代碼的復用性垢油,父類/基類中原有的內(nèi)容盆驹,在子類/派生類中無需再定義,直接使用即可

繼承是實現(xiàn)多態(tài)的前提

【4】繼承的格式

????已有class A滩愁,要創(chuàng)建一個class B繼承自A

????class B:權限 A? ----->創(chuàng)建一個B類躯喇,用特定的權限繼承方式繼承自A

????A類可以被稱為父類、基類

????B類可以被稱為子類、派生類

????class B:public A{}? ---->B類公有繼承A類

????class B:private A{}? ---->B類私有繼承A類

????class B:protected A{}? ---->B類受保護的繼承A類

三種繼承權限? ? ? ? ? ? ? ? ? ?

????父類中訪問權限? ??

? ? ? ?public|protected|private? ? ? public|protected|private? ? ? public|protected|private?

????繼承方式? ? ? ? ? ? ? ?

?????????????????????????public? ? ? ? ? ? ? ? ? ? ? ????????? private? ? ? ? ? ? ? ? ? ? ? ? ? protected? ? ? ? ? ?

子類中訪問權限? ??

????????public|protected|不能訪問? ? ? private|private|不能訪問? ? ? ? protected|protected|不能訪問

【5】子類對父類中成員的繼承

子類會繼承父類中的所有成員廉丽,包括私有成員

類之間的繼承關系倦微,可以理解為是包含關系

子類中從父類繼承的成員,先存放正压,放在首地址欣福,父類的指針/引用可以指向子類的對象

父類的指針,可以訪問的空間焦履,只有父類本身的內(nèi)容拓劝,子類的指針可以訪問的空間包含父類繼承的和子類拓展的

【6】子類中存在和父類同名成員時

????通過子類對象默認訪問的是,子類的成員

????如果想要訪問父類的成員嘉裤,使用類名加上域標識符可以訪問父類中的內(nèi)容

????或者也可以通過父類的指針指向子類對象郑临,再來訪問

三、繼承中特殊的成員函數(shù)

這四個成員函數(shù)都不會被繼承

【1】構造函數(shù)

父類中的構造函數(shù)不會被繼承

實例化子類對象時价脾,先調(diào)用父類中的構造函數(shù)恬总,再調(diào)用子類中的構造函數(shù)

如果父類中只有有參構造蔚龙,子類必須在構造函數(shù)的初始化列表中顯性的調(diào)用父類的有參構造

【2】析構函數(shù)

父類中的析構函數(shù)不會被子類繼承

先析構子類,再析構父類

有指針成員的情況:如果父類中有指針成員,需要在父類的析構函數(shù)中手動釋放堆區(qū)的空間狼犯;如果子類中有指針成員,需要在子類的析構函數(shù)中手動釋放堆區(qū)的空間

父類的析構函數(shù)显沈,不需要再子類中手動調(diào)用积蜻,系統(tǒng)會自動調(diào)用析構函數(shù)

【3】拷貝構造函數(shù)

申請空間并初始化

如果父類中有指針成員,繼承時會不會涉及到深淺拷貝問題骇笔?會

父類的拷貝構造不會被繼承

如果父類中有指針成員省店,需要顯性寫出父類的深拷貝函數(shù);如果指針成員在子類中九顯性寫出子類的深拷貝函數(shù)

子類的拷貝構造需要顯性調(diào)用父類的拷貝構造笨触,直接傳子類的對象

【4】拷貝賦值函數(shù)

拷貝賦值函數(shù)也涉及到深淺拷貝問題

拷貝賦值函數(shù)也不會被繼承

子類和父類有不同的拷貝賦值函數(shù)

如果父類中有指針成員懦傍,就顯性寫出父類的深拷貝賦值函數(shù),如果子類中有指針成員芦劣,就顯性寫出子類的深拷貝賦值函數(shù)粗俱,如果顯性寫出了子類的深拷貝賦值,子類的拷貝賦值函數(shù)內(nèi)一定要顯性調(diào)用父類的拷貝賦值函數(shù)虚吟。

#include <iostream>

using namespace std;

class Person

{

private:

? ? int *age;

? ? string name;

public:

? ? //無參構造

? ? Person():age(new int){cout << "Per無參構造" << endl;}

? ? //有參構造

? ? Person(string name,int age):name(name),age(new int(age))

? ? {cout << "Per的有參構造" << endl;}

? ? //拷貝構造

? ? Person(Person &other):age(new int(*(other.age)))

? ? {

? ? ? ? //*(this->age) = *(other.age);

? ? ? ? this->name = other.name;

? ? }

? ? ~Person()

? ? {

? ? ? ? cout << "釋放了堆區(qū)的空間" << age << endl;

? ? ? ? delete age;

? ? ? ? cout << "Person的析構函數(shù)" << endl;

? ? }

? ? void show()

? ? {

? ? ? ? cout << "Per中age" << *age << endl;

? ? }

? ? void show_()

? ? {

? ? ? ? cout << age << endl;

? ? }

? ? //Person的深拷貝賦值

? ? Person &operator=(const Person &other)

? ? {

? ? ? ? if(this!=&other)

? ? ? ? {

? ? ? ? ? ? this->name = other.name;

? ? ? ? ? ? *(this->age) = *(other.age);

? ? ? ? }

? ? ? ? return *this;

? ? }

};

//定義Stu類繼承自Person

//類默認是私有繼承寸认,常用的繼承方式是公有的

class Stu:public Person

{

public:

? ? int score;

public:

? ? Stu(){}

? ? //子類的有參構造,在初始化列表中顯性的調(diào)用父類的有參構造

? ? Stu(string name,int age,int score):Person(name,age),score(score)

? ? {cout << "Stu的有參構造" << endl;}

//? ? void show()

//? ? {

//? ? ? ? //cout << name << endl;

//? ? ? ? //cout << "Person的name" << Person::name << endl;

//? ? ? ? //子類中不能訪問父類繼承下來的私有成員

//? ? ? ? //cout << "Person中的name" << name << endl;

//? ? ? ? //子類中可以訪問從父類繼承下來的受保護的成員

//? ? ? ? //cout << "Person中的age" << age << endl;

//? ? }

? ? ~Stu(){cout << "Stu的析構" << endl;}

? ? //Person(Person &other)

? ? Stu(Stu &other):Person(other)? //對于Person的拷貝構造,傳子類的對象串慰,父類的引用可以引用子類的對象

? ? {

? ? ? ? this->score = other.score;

? ? ? ? cout << "Stu的拷貝構造" << endl;

? ? }

? ? Stu &operator=(const Stu &other)

? ? {

? ? ? ? if(this!=&other)

? ? ? ? {

? ? ? ? ? ? //顯性調(diào)用Person的拷貝賦值

? ? ? ? ? ? Person::operator=(other);

? ? ? ? ? ? cout << "Stu的拷貝賦值函數(shù)" << endl;

? ? ? ? ? ? this->score = other.score;

? ? ? ? }

? ? ? ? return *this;

? ? }

};

int main()

{

? ? Stu s;? //無參構造

? ? s.show_();

? ? Stu s1("zhangsan",20,100);? //有參構造

? ? cout << "s1" << "\t" ;

? ? s1.show();

? ? //拷貝構造

? ? //Stu s2 = s1;? //調(diào)用拷貝構造偏塞,需要開辟空間

? ? s = s1;

? ? cout << "s" << "\t" ;

? ? s.show();

//? ? cout << "s1的地址" << &s1 << endl;? //a0

//? ? s1.Person::show();

//? ? Person *p = &s1;

//? ? p->show();? //通過父類指針訪問到的是父類中的show函數(shù)

//? ? cout << "s1中首成員的地址" << &s1.score << endl;

? ? return 0;

}

四、多重繼承

一個子類由多個父類繼承而來/一個派生類由多個基類派生出來

格式

class B:public A,private C

class 類名:繼承權限1 類1,繼承權限2 類2·····

{

? ? //子類拓展的內(nèi)容

};

如果多個基類(父類)中有同名成員邦鲫,會發(fā)生歧義灸叼,通過類名加上域限定符訪問指定的成員。

特殊的成員函數(shù)調(diào)用和使用的規(guī)律和普通繼承時一致

多重繼承時,構造函數(shù)的調(diào)用順序怜姿,和繼承的順序有關慎冤,和初始化列表中的調(diào)用順序無關。

#include <iostream>

using namespace std;

class Person

{

public:

? ? string name;

? ? int age;

? ? Person(){cout << "p無參構造" << endl;}

? ? Person(string name,int age):name(name),age(age)

? ? {

? ? ? ? cout << "P有參構造" << endl;

? ? }

};

class Stu

{

public:

? ? int age;

? ? int score;

? ? Stu(){cout << "Stu無參構造" << endl;}

? ? Stu(int age,int score):age(age),score(score)

? ? {cout << "Stu有參構造" << endl;}

};

//A類繼承自Person類和Stu類

class A:public Person,public Stu

{

? ? int high;

public:

? ? A(){cout << "A無參構造" << endl;}

? ? A(int h,string name,int age1,int age2,int score):Stu(age2,score),Person(name,age1),high(h)

? ? {cout << "A有參構造" << endl;}

};

int main()

{

? ? A a1;? //Person的構造函數(shù)先被調(diào)用

? ? cout << "a2****************************" << endl;

? ? A a2(100,"zhangsan",78,90,23);

? ? cout << a2.Stu::age << endl;

? ? cout << a2.Person::age << endl;

? ? return 0;

}

五沧卢、菱形繼承(鉆石繼承)

公共基類的內(nèi)容會在匯集子類中保留兩份蚁堤。

對于訪問公共基類中成員時,會存在二義性的問題

如果多次繼承大型的公共基類但狭,會導致子類的內(nèi)存過大披诗。

【1】虛繼承(virtual)

虛繼承用于解決菱形繼承存在的問題,通過菱形繼承公共基類中的額內(nèi)容只會在匯集子類中保存一份立磁,不會造成子類的內(nèi)存過大呈队。

virtual關鍵字,只對關鍵字后面所跟的類起作用唱歧,表示虛繼承virtual后面的類宪摧,兩個中間基類都需要加virtual

如果使用虛繼承,對于公共基類的構造函數(shù)颅崩,需要直接使用基類名來調(diào)用(因為不知道通過那一條中間路徑繼承的基類)

雖然几于,只保留了一份公共基類,但是仍然可以通過指定路徑來訪問基類中的成員

#include <iostream>

using namespace std;

class Person

{

public:

? ? string name;

? ? int age;

? ? Person(){cout << "p無參構造" << endl;}

? ? Person(string name,int age):name(name),age(age){}

};

//Stu虛繼承Person

class Stu:virtual public Person

{

public:

? ? int score;

? ? Stu(){cout << "Stu無參構造" << endl;}

? ? Stu(int score):score(score){}

};

//B虛繼承Person

class B:virtual public Person

{

? ? int bb;

public:

? ? B(){}

? ? B(int b):bb(b){}

};

class A:public B,public Stu

{

? ? int high;

public:

? ? A(){cout << "A無參構造" << endl;}

? ? A(int h,int s,int b,int a,string name):high(h),Stu(s),B(b),Person(name,a)

? ? {

? ? }

};

int main()

{

? ? //A a1;? //Person的構造函數(shù)先被調(diào)用

? ? A a1(100,78,9,18,"zhangsan");

? ? cout << "a2****************************" << endl;

//? ? cout << a1.B::age << endl;? //指定訪問從B路徑繼承下來的age

//? ? cout << a1.Stu::age << endl;? //指定訪問從Stu路徑繼承下來的age

? ? cout << a1.age << endl;? //直接通過匯集子類來訪問基類中的成員

? ? return 0;

}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沿后,一起剝皮案震驚了整個濱河市沿彭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尖滚,老刑警劉巖喉刘,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漆弄,居然都是意外死亡睦裳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門撼唾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廉邑,“玉大人,你說我怎么就攤上這事券坞。” “怎么了肺素?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵恨锚,是天一觀的道長。 經(jīng)常有香客問我倍靡,道長猴伶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮他挎,結果婚禮上筝尾,老公的妹妹穿的比我還像新娘。我一直安慰自己办桨,他們只是感情好筹淫,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呢撞,像睡著了一般损姜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殊霞,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天摧阅,我揣著相機與錄音,去河邊找鬼绷蹲。 笑死棒卷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的祝钢。 我是一名探鬼主播比规,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼太颤!你這毒婦竟也來了苞俘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤龄章,失蹤者是張志新(化名)和其女友劉穎吃谣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體做裙,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡岗憋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锚贱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仔戈。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拧廊,靈堂內(nèi)的尸體忽然破棺而出监徘,到底是詐尸還是另有隱情,我是刑警寧澤吧碾,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布凰盔,位于F島的核電站,受9級特大地震影響倦春,放射性物質(zhì)發(fā)生泄漏户敬。R本人自食惡果不足惜落剪,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尿庐。 院中可真熱鬧忠怖,春花似錦、人聲如沸抄瑟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锐借。三九已至问麸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钞翔,已是汗流浹背严卖。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留布轿,地道東北人哮笆。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像汰扭,于是被迫代替她去往敵國和親稠肘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一萝毛、友元(friend) 所謂友元项阴,就是給別人開權限用的,允許自己的朋友來訪問自己類中所有權限下的成員笆包,包括私有成...
    彬粉世界閱讀 60評論 0 0
  • 一环揽、類 在C++中,類是面向對象的基礎特征封裝的實現(xiàn)庵佣,我們可以將實現(xiàn)某事物的所有屬性(成員變量)歉胶、行為(成員函數(shù))...
    彬粉世界閱讀 77評論 0 2
  • 一、繼承過程中的特殊成員函數(shù) 1.1 構造函數(shù) 啥是構造函數(shù)巴粪?為啥要構造函數(shù)通今?所謂構造函數(shù),其實就為后面實例化對象...
    彬粉世界閱讀 65評論 0 2
  • 今天要學三個知識點:引用肛根、內(nèi)存分配及重載 一辫塌、引用 & 引用是C++對C的一個非常重要的擴充,引用的引入派哲,...
    彬粉世界閱讀 89評論 0 1
  • f# C++核心編程 本階段主要針對C++==面向對象==編程技術做詳細講解臼氨,探討C++中的核心和精髓。 ## 1...
    寧采晨閱讀 168評論 0 0