




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++繼承與派生本課件將深入講解C++中的繼承與派生,涵蓋基本概念、不同繼承方式、虛函數(shù)和虛基類、構(gòu)造和析構(gòu)函數(shù)、靜態(tài)成員、訪問(wèn)控制、類型轉(zhuǎn)換以及繼承的應(yīng)用場(chǎng)景等內(nèi)容。C++中的繼承代碼復(fù)用繼承是一種面向?qū)ο缶幊痰闹匾獧C(jī)制,它允許我們創(chuàng)建新的類(派生類)并繼承已有類的屬性和方法(基類),從而實(shí)現(xiàn)代碼復(fù)用,減少冗余代碼。代碼擴(kuò)展繼承可以用來(lái)擴(kuò)展現(xiàn)有類的功能,派生類可以添加新的屬性和方法,從而實(shí)現(xiàn)對(duì)基類功能的擴(kuò)展。多態(tài)實(shí)現(xiàn)繼承是多態(tài)實(shí)現(xiàn)的基礎(chǔ),通過(guò)虛函數(shù)和抽象類,我們可以實(shí)現(xiàn)不同類型的對(duì)象執(zhí)行同一方法的不同行為,提高代碼的可擴(kuò)展性和靈活性。繼承的概念和特點(diǎn)繼承是面向?qū)ο缶幊讨械囊环N機(jī)制,它允許一個(gè)類(派生類)繼承另一個(gè)類(基類)的屬性和方法。派生類可以訪問(wèn)基類的所有公共成員和受保護(hù)成員,但不能直接訪問(wèn)基類的私有成員。繼承關(guān)系是一種“is-a”關(guān)系,例如,汽車“is-a”交通工具。基類與派生類基類基類是被繼承的類,也稱為父類或超類。它定義了派生類所繼承的屬性和方法。派生類派生類是繼承自基類的類,也稱為子類或派生類。它可以繼承基類的屬性和方法,并添加新的屬性和方法。繼承的形式1公有繼承(public):派生類繼承基類的所有公共成員和受保護(hù)成員,并將其作為自己的公共成員。2保護(hù)繼承(protected):派生類繼承基類的所有公共成員和受保護(hù)成員,并將其作為自己的受保護(hù)成員。3私有繼承(private):派生類繼承基類的所有公共成員和受保護(hù)成員,并將其作為自己的私有成員。公有繼承代碼示例classAnimal{public:voidmove(){cout<<"動(dòng)物正在移動(dòng)"<<endl;}};classDog:publicAnimal{public:voidbark(){cout<<"狗在叫"<<endl;}};繼承特點(diǎn)在公有繼承中,派生類可以訪問(wèn)基類的所有公共成員和受保護(hù)成員,并將其作為自己的公共成員。這意味著派生類的對(duì)象可以像使用基類對(duì)象一樣使用繼承的成員。保護(hù)繼承代碼示例classAnimal{protected:intage;public:voidsetAge(inta){age=a;}intgetAge(){returnage;}};classDog:protectedAnimal{public:voidbark(){cout<<"狗在叫"<<endl;}};繼承特點(diǎn)保護(hù)繼承允許派生類訪問(wèn)基類的所有公共成員和受保護(hù)成員,但將其作為自己的受保護(hù)成員。這意味著派生類可以訪問(wèn)這些成員,但其子類只能通過(guò)派生類來(lái)訪問(wèn)它們。私有繼承代碼示例classAnimal{private:intage;public:voidsetAge(inta){age=a;}intgetAge(){returnage;}};classDog:privateAnimal{public:voidbark(){cout<<"狗在叫"<<endl;}};繼承特點(diǎn)私有繼承將基類的所有公共成員和受保護(hù)成員都作為派生類的私有成員。這意味著派生類可以訪問(wèn)這些成員,但其子類和外部代碼都不能直接訪問(wèn)。多重繼承代碼示例classA{public:voidmethodA(){cout<<"A類的方法"<<endl;}};classB{public:voidmethodB(){cout<<"B類的方法"<<endl;}};classC:publicA,publicB{public:voidmethodC(){cout<<"C類的方法"<<endl;}};繼承特點(diǎn)多重繼承允許一個(gè)派生類繼承多個(gè)基類。派生類可以繼承所有基類的公共成員和受保護(hù)成員,但需要明確指定繼承方式,例如公有繼承、保護(hù)繼承或私有繼承。虛函數(shù)和虛基類1虛函數(shù)是指在基類中聲明為virtual的函數(shù),它允許在派生類中重寫(xiě)基類中的函數(shù),從而實(shí)現(xiàn)多態(tài)性。2虛基類是指在繼承關(guān)系中被多個(gè)派生類共享的基類,它確保派生類的對(duì)象只包含基類的一個(gè)副本,而不是多個(gè)副本。虛函數(shù)的實(shí)現(xiàn)代碼示例classAnimal{public:virtualvoidmakeSound(){cout<<"動(dòng)物在叫"<<endl;}};classDog:publicAnimal{public:voidmakeSound()override{cout<<"狗在叫"<<endl;}};classCat:publicAnimal{public:voidmakeSound()override{cout<<"貓?jiān)诮?<<endl;}};實(shí)現(xiàn)機(jī)制虛函數(shù)的實(shí)現(xiàn)利用虛函數(shù)表(vtable)來(lái)實(shí)現(xiàn)。每個(gè)類都有一個(gè)虛函數(shù)表,其中存儲(chǔ)了該類的所有虛函數(shù)的地址。派生類重寫(xiě)虛函數(shù)后,會(huì)更新自己的虛函數(shù)表,指向新實(shí)現(xiàn)的函數(shù)地址。虛函數(shù)與多態(tài)代碼示例Animal*animal=newDog();animal->makeSound();//輸出:狗在叫animal=newCat();animal->makeSound();//輸出:貓?jiān)诮卸鄳B(tài)實(shí)現(xiàn)通過(guò)虛函數(shù),我們可以使用基類指針指向不同類型的派生類對(duì)象,并調(diào)用相同的方法,但執(zhí)行不同的行為。這就是多態(tài)性的體現(xiàn),它允許我們用統(tǒng)一的方式處理不同類型的對(duì)象。純虛函數(shù)與抽象類代碼示例classShape{public:virtualdoublegetArea()=0;//純虛函數(shù)};classCircle:publicShape{public:doublegetArea()override{return3.14159*radius*radius;}private:doubleradius;};概念解釋純虛函數(shù)是虛函數(shù),但沒(méi)有函數(shù)體。抽象類是指包含至少一個(gè)純虛函數(shù)的類。抽象類不能直接實(shí)例化,只能作為基類被繼承,用于定義接口,強(qiáng)制派生類實(shí)現(xiàn)純虛函數(shù)。抽象類的使用代碼示例Shape*shape=newCircle(5);//創(chuàng)建一個(gè)圓形對(duì)象cout<<shape->getArea()<<endl;//輸出:78.5397應(yīng)用場(chǎng)景抽象類主要用于定義接口,強(qiáng)制派生類實(shí)現(xiàn)特定的方法,例如在圖形系統(tǒng)中,使用Shape類來(lái)定義圖形的接口,不同的圖形類(圓形、矩形等)需要實(shí)現(xiàn)getArea()方法來(lái)計(jì)算面積。構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)是在創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用的函數(shù),用于初始化對(duì)象的成員變量。它與類同名,沒(méi)有返回值類型。析構(gòu)函數(shù)析構(gòu)函數(shù)是在對(duì)象銷毀時(shí)自動(dòng)調(diào)用的函數(shù),用于釋放對(duì)象占用的資源。它以“~”開(kāi)頭,后面跟類名,沒(méi)有返回值類型。構(gòu)造函數(shù)的繼承代碼示例classAnimal{public:Animal(stringname):name(name){cout<<"Animal構(gòu)造函數(shù)"<<endl;}private:stringname;};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){cout<<"Dog構(gòu)造函數(shù)"<<endl;}private:intage;};繼承特點(diǎn)派生類的構(gòu)造函數(shù)必須先調(diào)用基類的構(gòu)造函數(shù)來(lái)初始化基類成員,可以使用初始化列表來(lái)實(shí)現(xiàn)。初始化列表中的基類構(gòu)造函數(shù)調(diào)用必須放在派生類構(gòu)造函數(shù)參數(shù)列表之后。析構(gòu)函數(shù)的繼承代碼示例classAnimal{public:Animal(stringname):name(name){cout<<"Animal構(gòu)造函數(shù)"<<endl;}~Animal(){cout<<"Animal析構(gòu)函數(shù)"<<endl;}private:stringname;};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){cout<<"Dog構(gòu)造函數(shù)"<<endl;}~Dog(){cout<<"Dog析構(gòu)函數(shù)"<<endl;}private:intage;};繼承特點(diǎn)派生類的析構(gòu)函數(shù)會(huì)在對(duì)象銷毀時(shí)自動(dòng)調(diào)用,它會(huì)先調(diào)用基類的析構(gòu)函數(shù)來(lái)釋放基類成員占用的資源,然后釋放派生類成員占用的資源。虛析構(gòu)函數(shù)代碼示例classAnimal{public:virtual~Animal(){cout<<"Animal析構(gòu)函數(shù)"<<endl;}};classDog:publicAnimal{public:~Dog(){cout<<"Dog析構(gòu)函數(shù)"<<endl;}};應(yīng)用場(chǎng)景當(dāng)使用基類指針指向派生類對(duì)象時(shí),如果基類的析構(gòu)函數(shù)不是虛函數(shù),那么在釋放基類指針時(shí),只有基類的析構(gòu)函數(shù)會(huì)被調(diào)用,派生類的析構(gòu)函數(shù)不會(huì)被調(diào)用,導(dǎo)致內(nèi)存泄漏。為了避免這種情況,需要將基類的析構(gòu)函數(shù)聲明為虛函數(shù)。利用初始化列表代碼示例classAnimal{public:Animal(stringname):name(name){}private:stringname;};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){}private:intage;};使用建議在派生類的構(gòu)造函數(shù)中,使用初始化列表來(lái)初始化成員變量是一種良好的編程習(xí)慣,因?yàn)樗梢蕴岣叽a的可讀性和效率。例如,在上面的代碼中,我們使用初始化列表來(lái)初始化基類Animal中的name成員變量和派生類Dog中的age成員變量。繼承中的靜態(tài)成員代碼示例classAnimal{public:staticintcount;};intAnimal::count=0;//靜態(tài)成員初始化classDog:publicAnimal{public:voidbark(){cout<<"狗在叫"<<endl;}};繼承特點(diǎn)靜態(tài)成員屬于類,而不是對(duì)象,每個(gè)類只有一個(gè)靜態(tài)成員的副本。派生類可以繼承基類的靜態(tài)成員,但不能修改基類的靜態(tài)成員。在派生類中,可以使用基類名和作用域運(yùn)算符來(lái)訪問(wèn)基類的靜態(tài)成員。繼承中的靜態(tài)成員函數(shù)代碼示例classAnimal{public:staticvoidprintCount(){cout<<"動(dòng)物數(shù)量:"<<count<<endl;}private:staticintcount;};intAnimal::count=0;classDog:publicAnimal{public:voidbark(){cout<<"狗在叫"<<endl;}};繼承特點(diǎn)靜態(tài)成員函數(shù)屬于類,而不是對(duì)象,它可以通過(guò)類名和作用域運(yùn)算符來(lái)調(diào)用。派生類可以繼承基類的靜態(tài)成員函數(shù),并可以直接調(diào)用它們。訪問(wèn)控制與繼承代碼示例classA{private:inta;protected:intb;public:intc;};classB:publicA{public:voidprintB(){cout<<b<<endl;//可以訪問(wèn)保護(hù)成員b}};訪問(wèn)控制在繼承中,派生類對(duì)基類成員的訪問(wèn)權(quán)限取決于基類成員的訪問(wèn)控制和繼承方式。例如,在公有繼承中,派生類可以訪問(wèn)基類的公共成員和受保護(hù)成員,但不能訪問(wèn)基類的私有成員。保護(hù)成員的特點(diǎn)1保護(hù)成員是基類中聲明為protected的成員變量和方法。它們只能被基類本身和其派生類訪問(wèn)。2保護(hù)成員通常用于定義基類內(nèi)部需要被派生類訪問(wèn)但不想被外部代碼訪問(wèn)的成員。保護(hù)成員的繼承代碼示例classAnimal{protected:stringname;public:Animal(stringname):name(name){}};classDog:publicAnimal{public:voidprintName(){cout<<name<<endl;//可以訪問(wèn)保護(hù)成員name}};繼承特點(diǎn)在保護(hù)繼承中,派生類將繼承基類的保護(hù)成員,并將其作為自己的保護(hù)成員。這意味著派生類可以訪問(wèn)這些成員,但其子類只能通過(guò)派生類來(lái)訪問(wèn)它們。類型轉(zhuǎn)換與繼承1動(dòng)態(tài)類型轉(zhuǎn)換:在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類型進(jìn)行類型轉(zhuǎn)換,使用dynamic_cast運(yùn)算符。2靜態(tài)類型轉(zhuǎn)換:在編譯時(shí)根據(jù)變量的聲明類型進(jìn)行類型轉(zhuǎn)換,使用static_cast運(yùn)算符。動(dòng)態(tài)類型轉(zhuǎn)換代碼示例classAnimal{public:virtualvoidmakeSound(){cout<<"動(dòng)物在叫"<<endl;}};classDog:publicAnimal{public:voidmakeSound()override{cout<<"狗在叫"<<endl;}};Animal*animal=newDog();Dog*dog=dynamic_cast(animal);if(dog!=nullptr){dog->bark();//只有當(dāng)animal指向Dog對(duì)象時(shí),才能調(diào)用bark()方法}else{cout<<"animal不是Dog類型的對(duì)象"<<endl;}應(yīng)用場(chǎng)景動(dòng)態(tài)類型轉(zhuǎn)換主要用于在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類型執(zhí)行不同的操作。例如,在圖形系統(tǒng)中,使用dynamic_cast來(lái)判斷一個(gè)圖形對(duì)象是否是圓形,如果是,則調(diào)用其計(jì)算面積的方法。靜態(tài)類型轉(zhuǎn)換代碼示例classAnimal{public:Animal(stringname):name(name){}private:stringname;};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){}private:intage;};Dog*dog=newDog("旺財(cái)",3);Animal*animal=static_cast(dog);//將Dog對(duì)象轉(zhuǎn)換為Animal對(duì)象應(yīng)用場(chǎng)景靜態(tài)類型轉(zhuǎn)換主要用于在編譯時(shí)進(jìn)行類型轉(zhuǎn)換,它是一種安全的類型轉(zhuǎn)換,不會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。例如,將派生類對(duì)象轉(zhuǎn)換為基類對(duì)象時(shí),可以使用static_cast運(yùn)算符。常量對(duì)象與繼承代碼示例classAnimal{public:Animal(stringname):name(name){}voidprintName()const{cout<<name<<endl;}private:stringname;};constAnimalanimal("小貓");//創(chuàng)建一個(gè)常量Animal對(duì)象animal.printName();//可以調(diào)用常量成員函數(shù)繼承特點(diǎn)常量對(duì)象不能修改其成員變量的值。常量成員函數(shù)是指聲明為const的成員函數(shù),它不能修改對(duì)象的狀態(tài)。常量對(duì)象只能調(diào)用常量成員函數(shù),以確保其狀態(tài)不會(huì)被改變。常量成員函數(shù)代碼示例classAnimal{public:Animal(stringname):name(name){}voidprintName()const{cout<<name<<endl;}private:stringname;};使用建議如果一個(gè)成員函數(shù)不修改對(duì)象的狀態(tài),那么應(yīng)該將其聲明為const成員函數(shù),這樣可以提高代碼的可讀性和安全性。例如,在上面的代碼中,printName()函數(shù)只輸出對(duì)象的name成員變量的值,它不修改對(duì)象的狀態(tài),因此應(yīng)該將其聲明為const成員函數(shù)。常量對(duì)象的初始化代碼示例classAnimal{public:Animal(stringname):name(name){}private:stringname;};constAnimalanimal("小貓");//創(chuàng)建一個(gè)常量Animal對(duì)象初始化方法常量對(duì)象必須在聲明時(shí)進(jìn)行初始化,并且初始化值必須是常量表達(dá)式,例如字面量或常量變量。常量對(duì)象不能在構(gòu)造函數(shù)中進(jìn)行初始化。常量引用代碼示例constAnimalanimal("小貓");constAnimal&ref=animal;//創(chuàng)建一個(gè)常量引用應(yīng)用場(chǎng)景常量引用可以用來(lái)引用常量對(duì)象,它可以保證引用的對(duì)象不會(huì)被修改。常量引用可以提高代碼的效率和安全性。友元與繼承代碼示例classAnimal{private:stringname;friendclassDog;//聲明Dog類為Animal類的友元類};classDog{public:voidprintName(Animal&animal){cout<<<<endl;//可以訪問(wèn)Animal類的私有成員name}};繼承特點(diǎn)友元關(guān)系不具有傳遞性,也就是說(shuō),如果A類是B類的友元,而B(niǎo)類是C類的友元,那么A類并不一定是C類的友元。友元關(guān)系是用來(lái)打破類的封裝性,在某些情況下可以提高代碼的效率或靈活性。友元函數(shù)的調(diào)用代碼示例Animalanimal("小貓");Dogdog;dog.printName(animal);//通過(guò)Dog類的友元函數(shù)訪問(wèn)Animal類的私有成員調(diào)用方式友元函數(shù)可以通過(guò)友元關(guān)系訪問(wèn)類的私有成員和保護(hù)成員。友元函數(shù)可以通過(guò)對(duì)象名和作用域運(yùn)算符來(lái)調(diào)用,也可以通過(guò)友元類的對(duì)象來(lái)調(diào)用。友元類的定義代碼示例classAnimal{private:stringname;friendclassDog;//聲明Dog類為Animal類的友元類};classDog{public:voidprintName(Animal&animal){cout<<<<endl;//可以訪問(wèn)Animal類的私有成員name}};定義方法友元類可以通過(guò)在友元類的聲明中使用friend關(guān)鍵字來(lái)定義。友元類可以訪問(wèn)友元類的所有成員,包括私有成員和保護(hù)成員。繼承與公有成員訪問(wèn)代碼示例classAnimal{public:Animal(stringname):name(name){}voidprintName(){cout<<name<<endl;}private:stringname;};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){}voidbark(){cout<<"狗在叫"<<endl;}private:intage;};Dogdog("旺財(cái)",3);dog.printName();//可以訪問(wèn)基類的公有成員printName()訪問(wèn)特點(diǎn)在公有繼承中,派生類可以訪問(wèn)基類的所有公有成員和受保護(hù)成員,并將其作為自己的公有成員。這意味著派生類可以像使用基類對(duì)象一樣使用繼承的成員。繼承與保護(hù)成員訪問(wèn)代碼示例classAnimal{protected:stringname;public:Animal(stringname):name(name){}};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){}voidprintName(){cout<<name<<endl;//可以訪問(wèn)基類的保護(hù)成員name}private:intage;};Dogdog("旺財(cái)",3);dog.printName();//可以訪問(wèn)基類的保護(hù)成員name訪問(wèn)特點(diǎn)在公有繼承中,派生類可以訪問(wèn)基類的所有公有成員和受保護(hù)成員。這意味著派生類可以像使用基類對(duì)象一樣使用繼承的成員。繼承與私有成員訪問(wèn)代碼示例classAnimal{private:stringname;public:Animal(stringname):name(name){}};classDog:publicAnimal{public:Dog(stringname,intage):Animal(name),age(age){}private:intage;};Dogdog("旺財(cái)",3);//="小黑";//錯(cuò)誤:不能訪問(wèn)基類的私有成員name訪問(wèn)特點(diǎn)在所有繼承方式中,派生類都不能直接訪問(wèn)基類的私有成員。這是因?yàn)樗接谐蓡T是基類內(nèi)部的私有數(shù)據(jù),它們只能被基類本身訪問(wèn),不能被任何其他類訪問(wèn),包括派生類。繼承的應(yīng)用場(chǎng)景圖形系統(tǒng)使用基類Shape來(lái)定義圖形的接口,不同的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)污水廠設(shè)計(jì)中期檢查
- 股權(quán)回購(gòu)合伙協(xié)議書(shū)
- 股東出資用途協(xié)議書(shū)
- 管道維修用工協(xié)議書(shū)
- 聘請(qǐng)安全專家協(xié)議書(shū)
- 西雙版納個(gè)人協(xié)議書(shū)
- 學(xué)前教育學(xué)幼兒園評(píng)價(jià)體系構(gòu)建
- 苗木交易協(xié)議書(shū)(資金保障)
- 陪同調(diào)查協(xié)議
- 小學(xué)數(shù)學(xué)三年級(jí)下冊(cè)教學(xué)計(jì)劃與評(píng)估標(biāo)準(zhǔn)
- 量子計(jì)算與量子信息簡(jiǎn)介
- 焙炒咖啡生產(chǎn)許可證審查細(xì)則說(shuō)明
- 河南省駐馬店市重點(diǎn)中學(xué)2023-2024學(xué)年九年級(jí)上學(xué)期12月月考語(yǔ)文試題(無(wú)答案)
- 中考數(shù)學(xué)二元一次方程專題訓(xùn)練100題(含答案)
- 【教師共享】《羽毛球》教學(xué)評(píng)價(jià)及評(píng)價(jià)建議
- DB13-T 5742-2023醇基燃料使用安全規(guī)范
- 尾礦庫(kù)安全生產(chǎn)風(fēng)險(xiǎn)監(jiān)測(cè)預(yù)警系統(tǒng)運(yùn)行管理辦法
- 特殊教育:康復(fù)訓(xùn)練課程標(biāo)準(zhǔn)(年版)
- 南京秦淮外國(guó)語(yǔ)學(xué)校新初一分班英語(yǔ)試卷含答案
- 醫(yī)院陪護(hù)服務(wù)投標(biāo)方案(技術(shù)標(biāo) )
- 醫(yī)院四風(fēng)問(wèn)題自查報(bào)告及整改措施
評(píng)論
0/150
提交評(píng)論