版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
2023/11/1211234繼承與派生的概念第4章繼承與派生本章學(xué)習(xí)要點派生類的構(gòu)成派生類的聲明派生類中基類成員的訪問屬性5派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)2023/11/122698第4章繼承與派生本章學(xué)習(xí)要點多重繼承合成復(fù)制控制與繼承“繼承”的構(gòu)造函數(shù)7派生類的復(fù)制控制成員2023/11/1231211第4章繼承與派生本章學(xué)習(xí)要點圖書館圖書借閱管理系統(tǒng)中繼承與聚合的應(yīng)用聚合與組合10基類與派生類對象的關(guān)系2023/11/124本章學(xué)習(xí)目標1.理解繼承和派生的概念;2.掌握派生類的聲明方式,派生類的構(gòu)成;3.掌握三種不同繼承方式對基類成員、派生類成員訪問權(quán)限的影響;3.掌握派生類的構(gòu)造函數(shù)的定義與執(zhí)行;4.掌握派生類的復(fù)制控制成員的定義;4.掌握多重繼承的聲明方法;多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)的定義及執(zhí)行;5.理解虛基類的概念,掌握其作用和聲明方法;6.理解組合的概念,掌握繼承與派生在軟件開發(fā)中的意義。第4章繼承與派生2023/11/125現(xiàn)實世界中的例子幾何形狀矩形圓汽車工具車轎車面包車旅行車卡車交通工具小汽車飛機船2023/11/126現(xiàn)實世界中的例子猴子鳥貓科動物獅子獵豹虎銷售經(jīng)理經(jīng)理工人銷售人員職員2023/11/127面向?qū)ο蠹夹g(shù)強調(diào)軟件的可重用性(softwarereusability)。C++語言提供了類的繼承機制,解決了軟件重用問題。第4章繼承與派生通過繼承機制,可以方便地利用一個已有的類建立新類,重用已有軟件中的部分甚至很大的部分。微軟基礎(chǔ)類MFC,就是通過類的繼承來體現(xiàn)類的可重用性和可擴充性。2023/11/128在C++中,所謂“繼承”就是在一個或多個已存在的類的基礎(chǔ)上建立一個新的類。已存在的類稱為“基類”、“父類”或“一般類”。新建立的類稱為“派生類”、“子類”或“特殊類”。
4.1繼承與派生的概念第4章繼承與派生2023/11/129一個新類從已有的類那里獲得其已有特性,這種現(xiàn)象稱為類的繼承。通過繼承,一個新建子類從已有的父類那里獲得父類的特性。從另一角度說,從已有的父類產(chǎn)生一個新的子類,稱為類的派生。類的繼承是用已有的類來建立專用類的編程技術(shù)。4.1繼承與派生的概念第4章繼承與派生2023/11/1210派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù)(不包括基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)),并可以增加自己的新成員,同時也可以調(diào)整來自基類的數(shù)據(jù)成員和成員函數(shù)?;惡团缮愂窍鄬Χ缘?。一個基類可以派生出多個派生類,每一個派生類又可以作為基類再派生出新的派生類。一代一代地派生下去,就形成了類的繼承層次結(jié)構(gòu)。4.1繼承與派生的概念第4章繼承與派生2023/11/1211圖4-1單繼承中學(xué)生學(xué)生初中生高中生??粕究粕芯可T士生博士生大學(xué)生小學(xué)生留學(xué)生一個派生類只從一個基類派生,這稱為單繼承(singleinheritance),這種繼承關(guān)系所形成的層次是一個樹形結(jié)構(gòu),可以用圖4-1表示。第4章繼承與派生2023/11/1212圖4-2多繼承銷售經(jīng)理經(jīng)理工人銷售人員職員一個派生類不僅可以從一個基類派生,也可以從多個基類派生。一個派生類有兩個或多個基類的稱為多重繼承(multipleinheritance),這種繼承關(guān)系所形成的結(jié)構(gòu)如圖4-2所示。第4章繼承與派生2023/11/1213基類和派生類的關(guān)系,可以表述為:
派生類是基類的具體化,而基類是派生類的抽象。4.1繼承與派生的概念第4章繼承與派生2023/11/1214單繼承派生類的聲明格式如下:class
派生類名:[繼承方式]基類名{
派生類新增加的成員};4.2派生類的聲明方式第4章繼承與派生繼承方式可以是public(公用的)、private(私有的)、protected(受保護的)。此項是可選的,如果不寫此項,則默認為private(私有的)。2023/11/1215第4章繼承與派生classCircle
//聲明基類Circle——圓類{public://Circle類公用成員函數(shù)
voidsetRadious(intr){radious=r;}
intgetRadious(){returnradious;}voidshowRadious(){cout<<"BaseclassCircle:radious="<<radious<<endl;}private://Circle類私有數(shù)據(jù)成員
intradious;//圓半徑};2023/11/1216//以public方式聲明派生類Cylinder—圓柱體類classCylinder:publicCircle{public://Cylinder類公用成員函數(shù)voidsetHeight(inth){height=h;intgetHeight(){returnheight;}
voidshowHeight()
{cout<<"DerivedclassCylinder:height="<<height<<endl;}private:
//Cylinder類私有數(shù)據(jù)成員
intheight;//圓柱體高度};第4章繼承與派生2023/11/1217有時候我們會定義這樣一種類:不希望其他類繼承它,或者不想考慮它是否適合作為一個基類,為了實現(xiàn)這一目的,C++11提供了一種防止繼承發(fā)生的方法,即在類名后跟一個標識符final。//NoDerived不能作為基類classNoDerivedfinal{/*…*/}; //錯誤:NoDerived是final的classError:NoDerived{/*…*/} 4.1繼承與派生的概念第4章繼承與派生2023/11/1218classBase{/*…*/}; //Last不能作為基類classLastfinal:Base{/*…*/} //錯誤:Last是final的classError2:Last{/*…*/} 4.1繼承與派生的概念第4章繼承與派生還能把類中某個成員函數(shù)指定為final,則派生類中任何嘗試重寫該函數(shù)的操作都將引發(fā)編譯錯誤。詳見5.5節(jié)。2023/11/1219派生類中的成員包括從基類繼承過來的成員和自己新增加的成員兩大部分,從基類繼承過來的成員體現(xiàn)了派生類從基類繼承而獲得的共性,而新增加的成員體現(xiàn)了派生類的個性,體現(xiàn)了派生類與基類的不同,體現(xiàn)了不同派生類的區(qū)別。4.3派生類的構(gòu)成第4章繼承與派生2023/11/1220第4章繼承與派生圖4-3基類Circle及其派生類Cylinder的成員示意圖2023/11/1221實際上,并不是把基類的成員和派生類自己新增加的成員簡單地加在一起就成為派生類。構(gòu)造一個派生類一般經(jīng)歷3個步驟:1.從基類接收成員2.調(diào)整從基類接收的成員3.增加新成員4.3派生類的構(gòu)成第4章繼承與派生2023/11/1222從基類接收成員派生類要接收基類全部的成員(但不包括基類的構(gòu)造函數(shù)、析構(gòu)函數(shù)),也就是說是沒有選擇的,不能選擇接收其中一部分成員,而舍棄另一部分成員。
4.3派生類的構(gòu)成第4章繼承與派生2023/11/12232.調(diào)整從基類接收的成員調(diào)整包括二個方面:一方面,可以改變基類成員在派生類中的訪問屬性,這是通過指定繼承方式來實現(xiàn)的,如果在聲明派生類時指定繼承方式為私有的,則基類中的公用成員和保護成員在派生類中的訪問屬性就成了私有的,在派生類外不能訪問;通過在類內(nèi)使用using聲明語句,可進一步改變繼承方式作用下的基類成員在派生類中的訪問屬性。4.3派生類的構(gòu)成第4章繼承與派生2023/11/12242.調(diào)整從基類接收的成員調(diào)整包括二個方面:另一方面,可以在派生類中聲明一個與基類成員同名的成員,則派生類的新成員會屏蔽與其同名的基類成員,使同名的基類成員成為“不可見”的,即基類成員的名字被隱藏。關(guān)于基類成員在派生類中的訪問屬性問題和名字隱藏問題,稍后會作詳細介紹。4.3派生類的構(gòu)成第4章繼承與派生2023/11/12253.增加新成員這部分內(nèi)容是很重要的,它體現(xiàn)了派生類對基類功能的擴展。程序員要根據(jù)實際情況的需要,仔細考慮應(yīng)該給派生類增加哪些數(shù)據(jù)成員和成員函數(shù)。4.3派生類的構(gòu)成第4章繼承與派生2023/11/1226派生類中基類成員的訪問屬性不僅與在聲明基類時所聲明的訪問屬性有關(guān),而且與在聲明派生類時所指定的對基類的繼承方式,以及類內(nèi)using聲明語句的使用情況有關(guān),這些因素共同決定基類成員在派生類中的訪問屬性。4.4派生類中基類成員的訪問屬性第4章繼承與派生2023/11/1227派生類對基類的繼承方式有public,private和protected3種。不同的繼承方式?jīng)Q定了基類成員在派生類中的訪問屬性。(1)公用繼承(publicinheritance)基類的公用成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類私有。4.4派生類中基類成員的訪問屬性第4章繼承與派生2023/11/1228(2)私有繼承(privateinheritance)
基類的公用成員和保護成員在派生類中成了私有成員。其私有成員仍為基類私有。4.4派生類中基類成員的訪問屬性第4章繼承與派生2023/11/1229(3)受保護的繼承(protectedinheritance)基類的公用成員和保護成員在派生類中成了保護成員,其私有成員仍為基類私有。
保護成員的意思是:不能被外界訪問,但可以被派生類的成員訪問。4.4派生類中基類成員的訪問屬性第4章繼承與派生2023/11/1230在聲明一個派生類時將基類的繼承方式指定為public的,稱為公用繼承。用公用繼承方式建立的派生類稱為公用派生類(publicderivedclass),其基類稱為公用基類(publicbaseclass)。4.4.1公用繼承第4章繼承與派生2023/11/12314.4.1公用繼承第4章繼承與派生表4-1公用基類成員在派生類中的訪問屬性公用基類的成員在公用派生類中的訪問屬性私有成員不可訪問公用成員公用保護成員保護2023/11/1232第4章繼承與派生【例4-1】公用繼承的例子。
#include<iostream>usingnamespacestd;classCircle
//聲明基類Circle——圓類{public://Circle類公用成員函數(shù)
voidsetRadius(intr){radius=r;}
intgetRadius(){returnradius;}
voidshowRadius()
{cout<<"BaseclassCircle:radius="<<radius<<endl;}private://Circle類私有數(shù)據(jù)成員intradius;//圓半徑};2023/11/12燕京理工學(xué)院33//以public方式聲明公用派生類Cylinder——圓柱體類classCylinder:publicCircle{public://Cylinder類公用成員函數(shù)voidsetHeight(inth){height=h;}intgetHeight(){returnheight;}voidshowHeight()
{
cout<<"DerivedclassCylinder:height="<<height<<endl;}
voidset(intr,inth)
{
//radius=r;
setRadius(r);
height=h;
}
第4章繼承與派生2023/11/1234
voidshow(){
//cout<<"radius="<<radius<<endl;
cout<<"radius="<<getRadius()<<endl;//showRadius();//該語句與上句作用相同
cout<<"height="<<height<<endl;
}private:
//Cylinder類私有數(shù)據(jù)成員
intheight;//圓柱體高度};第4章繼承與派生2023/11/1235intmain(){
Cylinderobj;
obj.setRadius(10);
obj.showRadius();
obj.setHeight(20);
obj.showHeight();
obj.set(30,40);
obj.show();
return0;}第4章繼承與派生程序運行結(jié)果如下:BaseclassCircle:radius=10DerivedclassCylinder:height=20radius=30height=402023/11/1236在聲明一個派生類時將基類的繼承方式指定為private的,稱為私有繼承。用私有繼承方式建立的派生類稱為私有派生類(privatederivedclass),其基類稱為私有基類(privatebaseclass)。4.4.2私有繼承第4章繼承與派生2023/11/12374.4.2私有繼承第4章繼承與派生表4-2私有基類成員在派生類中的訪問屬性私有基類的成員在私有派生類中的訪問屬性私有成員不可訪問公用成員私有保護成員私有2023/11/1238第4章繼承與派生【例4-2】將【例4-1】中的公用繼承方式改為用私有繼承方式(基類Base不變)。私有派生類如下://以private方式聲明派生類Cyclinder
classCylinder:privateCircle{public://Cylinder類公用成員函數(shù)voidsetHeight(inth){height=h;}intgetHeight(){returnheight;}
voidshowHeight()
{cout<<"DerivedclassCylinder:height="
<<height<<endl;}
voidset(intr,inth){setRadius(r);height=h;}
voidshow()
{cout<<"radius="<<getRadius()<<endl;cout<<"height="<<height<<endl;
}private:
//Cylinder類私有數(shù)據(jù)成員
intheight;//圓柱體高度};2023/11/1239intmain(){
Cylinderobj;
//obj.setRadius(10);
//obj.showRadius();
obj.setHeight(20);
obj.showHeight();
obj.set(30,40);
obj.show();
return0;}第4章繼承與派生2023/11/1240由protected聲明的成員稱為“受保護的成員”,簡稱“保護成員”。從類的用戶角度來看,保護成員等價于私有成員。但有一點與私有成員不同,保護成員可以被派生類的成員函數(shù)訪問。4.4.3保護成員和保護繼承第4章繼承與派生2023/11/12燕京理工學(xué)院41在定義一個派生類時將基類的繼承方式指定為protected的,稱為保護繼承。用保護繼承方式建立的派生類稱為保護派生類(protectedderivedclass),其基類稱為受保護的基類(protectedbaseclass),簡稱保護基類。4.4.3保護成員和保護繼承第4章繼承與派生2023/11/1242第4章繼承與派生表4-3基類成員在派生類中的訪問屬性4.4.3保護成員和保護繼承基類中的成員在公用派生類中的訪問屬性在私有派生類中的訪問屬性在保護派生類中的訪問屬性私有成員不可訪問不可訪問不可訪問公用成員公用私有保護保護成員保護私有保護2023/11/1243通過以上的介紹,可以知道:(1)在派生類中,成員有4種不同的訪問屬性:①公用的:派生類內(nèi)和派生類外都可以訪問。②受保護的:派生類內(nèi)可以訪問,派生類外不能訪問,其下一層的派生類可以訪問。③私有的:派生類內(nèi)可以訪問,派生類外不能訪問。④不可訪問的:派生類內(nèi)和派生類外都不能訪問。4.4.3保護成員和保護繼承第4章繼承與派生2023/11/1244第4章繼承與派生表4-4派生類中的成員的訪問屬性派生類中的成員在派生類中在派生類外在下層公用派生類中派生類中訪問屬性為公用的成員可以可以可以派生類中訪問屬性為受保護的成員可以不可以可以派生類中訪問屬性為私有的成員可以不可以不可以在派生類中不可訪問的成員不可以不可以不可以2023/11/1245(2)類的成員在不同作用域中有不同的訪問屬性,對這一點要十分清楚。在學(xué)習(xí)過派生類之后,再討論一個類的某成員的訪問屬性,一定要指明是在哪一個作用域中。如基類Circle的成員函數(shù)setRadius,它在基類中的訪問屬性是公用的,在私有派生類Cylinder中的訪問屬性是私有的。4.4.3保護成員和保護繼承第4章繼承與派生2023/11/12燕京理工學(xué)院46第4章繼承與派生【例4-3】保護繼承的例子。//以private方式聲明派生類Cyclinder
classCylinder:protectedCircle{public://Cylinder類公用成員函數(shù)voidsetHeight(inth){height=h;}intgetHeight(){returnheight;}
voidshowHeight()
{cout<<"DerivedclassCylinder:height="
<<height<<endl;}
voidset(intr,inth){setRadius(r);height=h;}
voidshow()
{cout<<"radius="<<getRadius()<<endl;cout<<"height="<<height<<endl;
}private:
//Cylinder類私有數(shù)據(jù)成員
intheight;//圓柱體高度};2023/11/1247intmain(){
Cylinderobj;
//obj.setRadius(10);
//obj.showRadius();
obj.setHeight(20);
obj.showHeight();
obj.set(30,40);
obj.show();
return0;}第4章繼承與派生2023/11/1248有時我們需要改變派生類繼承的基類某個成員的可訪問性,通過使用using聲明可以達到這一目的。第4章繼承與派生class
Base{public:
size_t
size()
const
{
return
n;
}protected:
size_t
n;};
//注意:private繼承class
Derived
:
private
Base{public:
usingBase::size;protected:
usingBase::n;};
2023/11/1249在前面介紹派生類的構(gòu)成時曾提到:可以在派生類中聲明一個與基類成員同名的成員,則派生類的新成員會屏蔽與其同名的基類成員,使同名的基類成員成為“不可見”的,即基類成員的名字被隱藏。4.4.4成員同名問題第4章繼承與派生2023/11/12燕京理工學(xué)院50第4章繼承與派生【例4-4】派生類成員函數(shù)與基類成員函數(shù)同名。#include<iostream>usingnamespacestd;classCircle
//聲明基類Circle{public://基類公用成員
voidset(intr){radius=r;}voidshow(){cout<<"BaseclassCircle:radius="<<radius<<endl;}private://基類Circle的私有數(shù)據(jù)成員
intradius;//圓半徑};2023/11/1251第4章繼承與派生//以public方式聲明派生類CylinderclassCylinder:publicCircle{public:voidset(intr,inth){Circle::set(r);height=h;}voidshow(){Circle::show();cout<<"DerivedclassCylinder:height="<<height<<endl;}private:intheight;//圓柱體高度};2023/11/1252
intmain(){Cylinderobj;obj.set(10,20);//L3obj.show();//L4//obj.set(10);//L5錯誤obj.Circle::set(30);//L6正確
obj.Circle::show();//L7
return0;}第4章繼承與派生程序運行結(jié)果如下:BaseclassCircle:radius=10DerivedclassCylinder:height=20BaseclassCircle:radius=302023/11/1253從上例可以看出:(1)如果是在派生類中聲明了一個與基類成員函數(shù)名字相同,參數(shù)也相同的成員函數(shù),則基類中的成員函數(shù)將被隱藏。(2)如果是在派生類中聲明了一個與基類成員函數(shù)名字相同,但參數(shù)不同的成員函數(shù),則基類中的成員函數(shù)也將被隱藏。4.4.4成員同名問題第4章繼承與派生2023/11/1254第4章繼承與派生補充:派生類重定義基類數(shù)據(jù)成員的例子。#include<iostream>usingnamespacestd;classBase
//聲明基類{public://基類公用成員
floaty;voidset(intn){x=n;}voidshow(){cout<<"Baseclass:x="<<x<<endl;}private://基類私有成員
intx;};2023/11/1255第4章繼承與派生//以public方式聲明派生類Derived
classDerived:publicBase{public:voidset(inti,intj,intk){Base::set(i);y=j;z=k;}voidshow(){Base::show();cout<<"Baseclass:y="<<Base::y<<endl;cout<<"Derivedclass:y="<<y<<endl;cout<<"Derivedclass:z="<<z<<endl;}private:inty,z;};2023/11/1256
intmain()
{Derivedobj;
obj.set(1,2,3);
obj.Base::y=12.3;
obj.show();
return0;
}第4章繼承與派生程序運行結(jié)果如下:Baseclass:x=1Baseclass:y=12.3Derivedclass:y=2Derivedclass:z=32023/11/1257第4章繼承與派生補充實例人員類(Person)及其子類雇員類(Employee)的定義及使用。2023/11/1258第4章繼承與派生#include<iostream>usingnamespacestd;#include<cstring>classPerson//人員類定義{protected:charm_strName[10];//姓名
intm_nAge;//年齡
intm_nSex;//性別public:voidregister(char*name,intage,charsex) char*getName()//獲取姓名
intgetAge()//獲取年齡
chargetSex()//獲取性別
voidshowMe() };2023/11/1259第4章繼承與派生voidPerson::register(char*name,intage,charsex){ strcpy(m_strName,name); m_nAge=age; m_nSex=(sex=='m'?0:1);}char*Person::getName()//獲取姓名{returnm_strName;}intPerson::getAge()//獲取年齡{returnm_nAge;}charPerson::getSex()//獲取性別{returnm_nSex==0?'m':'f';}voidPerson::showMe(){cout<<GetName()<<"\t"<<GetSex()<<"\t"<<getAge()<<"\t"<<endl;}2023/11/1260第4章繼承與派生classEmployee:publicPerson//雇員類定義{charm_strDept[20];//工作部門
floatm_fSalary;//月薪public:Employee(){EmployeeRegister("XXX",0,'m',"XXX",0);}voidEmployeeRegister(char*name,intage,charsex,char*dept,floatsalary);voidshowMe();};2023/11/1261第4章繼承與派生voidEmployee::EmployeeRegister(char*name,intage,charsex,char*dept,floatsalary){ register(name,age,sex);strcpy(m_strDept,dept);m_fSalary=salary;}voidEmployee::showMe(){
//子類的成員函數(shù)可以調(diào)用基類的公有成員函數(shù)
cout<<getName()<<"\t"<<getSex()<<"\t"<<getAge()<<"\t";
//子類的成員函數(shù)也可以直接訪問基類的保護類數(shù)據(jù)
//cout<<m_strName<<"\t"<<m_nSex<<"\t"<<m_nAge<<"\t;cout<<m_strDept<<"\t"<<m_fSalary<<endl;}2023/11/1262第4章繼承與派生intmain(){Employeeemp;emp.showMe();emp.EmployeeRegister("張莉",40,'f',"圖書館",2000);emp.showMe();
/*基類的ShowMe()在公有繼承方式下相當于派生類的公有成員,在main()中可以顯式訪問基類成員*/emp.Person::showMe();cout<<"調(diào)用基類GetName()返回值:"<<emp.getName()<<endl;return0;}
2023/11/1263第4章繼承與派生練習(xí)題
定義一個基類有姓名、性別、年齡,再由基類派生出學(xué)生類和教師類,學(xué)生類增加學(xué)號、班級、專業(yè)和入學(xué)成績,教師類增加工號、職稱和工資。每個類都有相關(guān)數(shù)據(jù)的輸入和輸出方法。2023/11/12燕京理工學(xué)院64第4章繼承與派生#include<iostream.h>#include<string.h>#include<iomanip.h>classbase //定義一個基類{protected:charname[20]; //姓名
charsex[3]; //性別
intage; //年齡
…};classteacher:publicbase //基類派生出教師類{intsno; //工號
charzc[20]; //職稱
doublewages; //工資
…};classstudent:publicbase //基類派生出學(xué)生類{intsno; //學(xué)號
charbj[10]; //班級
charzy[10]; //專業(yè)
doublescore; //入學(xué)成績…};2023/11/1265由于基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類是不能繼承的。在聲明派生類時,一般還應(yīng)當自己定義派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。4.5派生類的構(gòu)造函數(shù)第4章繼承與派生2023/11/1266構(gòu)造函數(shù)的作用是在創(chuàng)建對象時對對象的數(shù)據(jù)成員進行初始化。派生類數(shù)據(jù)成員包括從基類繼承過來的數(shù)據(jù)成員和自己新增加的數(shù)據(jù)成員,在設(shè)計派生類的構(gòu)造函數(shù)時,不僅要考慮派生類新增數(shù)據(jù)成員的初始化,還應(yīng)當考慮對其從基類繼承過來的數(shù)據(jù)成員的初始化。采取的方法是在執(zhí)行派生類的構(gòu)造函數(shù)時,調(diào)用基類的構(gòu)造函數(shù)。4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1267下面從最簡單的派生類構(gòu)造函數(shù)的定義說起。所謂簡單的派生類是指只有一個基類,而且只有一級派生,在派生類的數(shù)據(jù)成員中不包含其他類對象的派生類。簡單的派生類構(gòu)造函數(shù)的定義請看下面這個例子:4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1268第4章繼承與派生【例4-5】簡單派生類的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;#include<string>classPerson//聲明基類Person{public:Person()=default;//默認構(gòu)造函數(shù)Person(stringName,stringSex,intAge):name(Name),sex(Sex),age(Age);{cout<<"TheconstructorofbaseclassPersoniscalled."<<endl;}2023/11/1269第4章繼承與派生【例4-5】簡單派生類的構(gòu)造函數(shù)。~Person()=default;//默認析構(gòu)函數(shù)voidshow(){cout<<"Theperson’sname:"<<name<<endl;cout<<"sex:"<<sex<<endl;cout<<"age:"<<age<<endl;}protected://基類的保護數(shù)據(jù)成員
stringname;//姓名,不超過5個漢字
stringsex;//性別,M:男,F(xiàn):女
intage;//年齡};2023/11/1270第4章繼承與派生//聲明基類Person的公用派生類Student——大學(xué)生類classStudent:publicPerson{public:Student()=default;//默認構(gòu)造函數(shù)Student(stringName,stringSex,stringAge,stringId,stringDate,floatScore):Person(Name,Sex,Age),id(Id),date(Date),score(Score){cout<<"TheconstructorofderivedclassStudentiscalled."<<endl;}2023/11/12燕京理工學(xué)院71第4章繼承與派生voidstuShow(){cout<<"student'sid:"<<id<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;cout<<"age:"<<age<<endl;cout<<"enrollmentdate:"<<date<<endl;cout<<"enrollmentscore:"<<score<<endl;}protected:stringid;//學(xué)號
stringdate;//入學(xué)時間
floatscore;//入學(xué)成績};2023/11/1272intmain(){Studentstu("Tom","男",18,"20200101001","2020.09.01",680);stu.stuShow();//輸出學(xué)生信息return0;}第4章繼承與派生2023/11/1273上例中派生類派生類Student的構(gòu)造函數(shù)有6個形參,前3個形參作為調(diào)用基類構(gòu)造函數(shù)的實參,后3個形參為對派生類新增數(shù)據(jù)成員初始化所需要的參數(shù)。其關(guān)系如圖4-4所示:
4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生圖4-4派生類Student的構(gòu)造函數(shù)的參數(shù)傳遞Student(stringName,stringSex,intAge,stringId,stringDate,floatScore):Person(Name,Sex,Age)2023/11/1274intmain(){Studentstu(“Mary","男",19,"20170101001","2017.09.01",680);stu.stuShow();//輸出學(xué)生信息return0;}第4章繼承與派生程序運行結(jié)果如下:TheconstructorofbaseclassPersoniscalled.TheconstructorofderivedclassStudentiscalled.Thestudent'sid:20170101001name:Marysex:男age:19enrollmentdate:2017.09.01enrollmentscore:6802023/11/1275從例4-5程序的運行結(jié)果可以看出派生類構(gòu)造函數(shù)的具體執(zhí)行過程:先調(diào)用基類的構(gòu)造函數(shù),對派生類對象從基類繼承過來的數(shù)據(jù)成員(name、sex、age)進行初始化。接下來初始化派生類新增的數(shù)據(jù)成員(id、date、score)。最后執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體。4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1276定義簡單派生類構(gòu)造函數(shù)的一般形式為:<派生類構(gòu)造函數(shù)名>(<總參數(shù)列表>):<基類構(gòu)造函數(shù)名>(<參數(shù)表>){<派生類新增數(shù)據(jù)成員初始化>};4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1277在建立一個對象時,執(zhí)行構(gòu)造函數(shù)的順序是:(1)最先調(diào)用基類的構(gòu)造函數(shù),對基類數(shù)據(jù)成員初始化。(2)再執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體,對派生類新增數(shù)據(jù)成員初始化。4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1278在使用派生類構(gòu)造函數(shù)時,還有以下幾種情況:(1)多級派生的構(gòu)造函數(shù)。一個類不僅可以派生出一個派生類,派生類還可以繼續(xù)派生,形成派生的層次結(jié)構(gòu)。在派生的層次結(jié)構(gòu)中,每一層派生類的構(gòu)造函數(shù)只負責(zé)調(diào)用其上一層(即它的直接基類)的構(gòu)造函數(shù)。若在【例4-5】的基礎(chǔ)上由派生類Student再派生出派生類Graduate,則派生類Graduate的定義如下:4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/12燕京理工學(xué)院79//聲明Student類的公用派生類Graduate——研究生類classGraduate:publicStudent{public:Graduate()=default;//默認構(gòu)造函數(shù)
//帶參構(gòu)造函數(shù),在其初始化列表中調(diào)用其直接基類的構(gòu)造函數(shù)Graduate(stringName,stringSex,intAge,stringId,stringDate,floatScore,stringDirect,stringTeacher):Student(Name,Sex,Age,Id,Date,Score),direct(Direct),teacher(Teacher){cout<<"TheconstructorofderivedclassGraduateiscalled."<<endl;}……};4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/12燕京理工學(xué)院80//聲明Student類的公用派生類Graduate——研究生類classGraduate:publicStudent{public:……voidgradShow(){stuShow();cout<<"direct:"<<direct<<endl;cout<<"teachername:"<<teacher<<endl;}protected://派生類的保護數(shù)據(jù)成員stringdirect;//研究方向stringteacher;//導(dǎo)師姓名};4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1281voidGradShow(){StuShow();cout<<"direct:"<<direct<<endl;cout<<"teachername:"<<teacher<<endl;}~Graduate()//派生類的析構(gòu)函數(shù){cout<<"ThedestructorofderivedclassGraduateiscalled."<<endl;}protected://派生類的保護數(shù)據(jù)成員chardirect[21];//研究方向,不超過10個漢字charteacher[11];//導(dǎo)師姓名,不超過5個漢字};4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1282(2)當不需要對派生類新增的成員進行任何初始化操作時,派生類構(gòu)造函數(shù)的函數(shù)體可以為空,即構(gòu)造函數(shù)是空函數(shù)。此派生類構(gòu)造函數(shù)的作用只是為了將參數(shù)傳遞給基類構(gòu)造函數(shù),并在執(zhí)行派生類構(gòu)造函數(shù)時調(diào)用基類構(gòu)造函數(shù)。4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1283(3)如果基類中沒有定義構(gòu)造函數(shù),或定義了沒有參數(shù)的構(gòu)造函數(shù),那么在定義派生類構(gòu)造函數(shù)時可以不寫基類構(gòu)造函數(shù)。在調(diào)用派生類構(gòu)造函數(shù)時,系統(tǒng)會自動調(diào)用基類的默認構(gòu)造函數(shù)。如果在基類中既定義了無參的構(gòu)造函數(shù),又定義了有參的構(gòu)造函數(shù)(構(gòu)造函數(shù)的重載),則在定義派生類構(gòu)造函數(shù)時,既可以包含基類構(gòu)造函數(shù)及其參數(shù),亦可以不包含基類構(gòu)造函數(shù)。在調(diào)用派生類構(gòu)造函數(shù)時,根據(jù)構(gòu)造函數(shù)的內(nèi)容決定調(diào)用基類的有參的構(gòu)造函數(shù)還是無參的構(gòu)造函數(shù)。我們可以根據(jù)派生類的需要決定采用哪一種方式。4.5.1派生類構(gòu)造函數(shù)第4章繼承與派生2023/11/1284派生類的合成復(fù)制控制成員:
合成的復(fù)制構(gòu)造函數(shù)、
合成的復(fù)制賦值運算符
合成的移動構(gòu)造函數(shù)
合成的移動賦值運算符
合成的析構(gòu)函數(shù)它們對派生類本身的成員依次進行初始化、賦值或析構(gòu)的操作。此外,這些合成的成員還負責(zé)使用直接基類中對應(yīng)的操作對一個對象的直接基類部分進行初始化、賦值或析構(gòu)的操作。4.6合成復(fù)制控制與繼承第4章繼承與派生2023/11/1285如果基類中的默認構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、復(fù)制賦值運算符或析構(gòu)函數(shù)是被刪除的函數(shù)或者不可訪問,則派生類中對應(yīng)的成員將是被刪除的,原因是編譯器不能使用基類成員來執(zhí)行派生類對象基類部分的構(gòu)造、賦值和析構(gòu)。如果基類中有一個不可訪問或者刪除掉的析構(gòu)函數(shù),則派生類中合成的默認和復(fù)制構(gòu)造函數(shù)將是被刪除的,因為編譯器無法析構(gòu)派生類對象的基類部分。4.6合成復(fù)制控制與繼承第4章繼承與派生2023/11/1286當使用=default請求一個移動操作時,如果基類中的對應(yīng)操作是刪除的或不可訪問的,那么派生類中該函數(shù)將是被刪除的,原因是派生類對象的基類部分不可移動。同樣,如果基類中的析構(gòu)函數(shù)是刪除的或不可訪問的,則派生類中的移動構(gòu)造函數(shù)也將是被刪除的。4.6合成復(fù)制控制與繼承第4章繼承與派生2023/11/1287移動操作與繼承:大多數(shù)基類都會定義一個虛析構(gòu)函數(shù)。因此在默認情況下,基類通常不含有合成的移動操作,而且在它的派生類中也沒有合成的移動操作。因為基類缺少移動操作會阻止派生類擁有自己的合成操作,所以當我們確實需要執(zhí)行移動操作時應(yīng)該首先在基類中進行定義。同時要記住,一旦類定義了自己的移動操作,那么它必須同時顯式地定義復(fù)制操作。這是因為如果類定義了一個移動構(gòu)造函數(shù)和/或一個移動賦值運算符,則該類的合成復(fù)制構(gòu)造函數(shù)和復(fù)制賦值運算符會被定義為刪除的。4.6合成復(fù)制控制與繼承第4章繼承與派生2023/11/1288定義派生類的復(fù)制和移動構(gòu)造函數(shù)定義派生類的復(fù)制和移動賦值運算符定義派生類的析構(gòu)函數(shù)4.7定義派生類的復(fù)制控制成員第4章繼承與派生2023/11/1289當為派生類定義復(fù)制或移動構(gòu)造函數(shù)時,通常要使用對應(yīng)的基類構(gòu)造函數(shù)初始化派生類對象的基類部分。請看下面的例子?!纠?-6】為4.5節(jié)中Person繼承體系中的類添加復(fù)制和移動構(gòu)造函數(shù)。
4.7.1定義派生類的復(fù)制和移動構(gòu)造函數(shù)第4章繼承與派生教材P1752023/11/1290與復(fù)制和移動構(gòu)造函數(shù)一樣,派生類的賦值運算符也必須顯式地為其基類部分賦值。【例4-7】為4.5節(jié)中Person繼承體系中的類添加復(fù)制和移動賦值運算符。
4.7.2定義派生類的復(fù)制和移動賦值運算符第4章繼承與派生教材P1772023/11/1291和構(gòu)造函數(shù)一樣,基類的析構(gòu)函數(shù)派生類也不能繼承。在聲明派生類時,可以根據(jù)需要定義自己的析構(gòu)函數(shù)。和構(gòu)造函數(shù)及賦值運算符不同的是,派生類析構(gòu)函數(shù)的函數(shù)體只負責(zé)釋放派生類自己分配的資源(一般為其指針數(shù)據(jù)成員所指向的內(nèi)存空間)。派生類對象的成員是析構(gòu)函數(shù)隱式的析構(gòu)部分自動被析構(gòu)的。類似的,派生類對象的基類部分也是析構(gòu)函數(shù)隱式的析構(gòu)部分自動被析構(gòu)的。在定義派生類的析構(gòu)函數(shù)時,不需要顯示書寫對基類析構(gòu)函數(shù)的調(diào)用。系統(tǒng)在執(zhí)行派生類的析構(gòu)函數(shù)時,會自動調(diào)用基類的析構(gòu)函數(shù)。4.7.3定義派生類的析構(gòu)函數(shù)第4章繼承與派生2023/11/1292第4章繼承與派生【例4-8】派生類的析構(gòu)函數(shù)。教材P1792023/11/1293派生類析構(gòu)函數(shù)的執(zhí)行過程:派生類析構(gòu)函數(shù)的執(zhí)行順序與構(gòu)造函數(shù)正好相反。(1)最先執(zhí)行派生類的析構(gòu)函數(shù)的函數(shù)體,對派生類新增加的成員進行清理。(2)再調(diào)用基類的析構(gòu)函數(shù),對基類進行清理。以此類推,沿著繼承體系的反方向直達最后。
4.7.3定義派生類的析構(gòu)函數(shù)第4章繼承與派生2023/11/1294在C++11標準中,派生類能夠重用其直接基類定義的構(gòu)造函數(shù)。盡管這些構(gòu)造函數(shù)并非以常規(guī)的方式繼承而來,但為了方便,我們不妨姑且稱其為“繼承”的。派生類繼承其直接基類構(gòu)造函數(shù)的方式是提供一條注明了直接基類名的using聲明語句??聪旅娲a中的Student類,令其繼承基類Person的構(gòu)造函數(shù)。4.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生2023/11/12954.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生classPerson//聲明基類Person{public:Person()=default;
//默認構(gòu)造函數(shù)
//帶參構(gòu)造函數(shù)Person(stringName,stringSex,intAge):name(Name),sex(Sex),age(Age){}protected://基類的保護數(shù)據(jù)成員stringname;//姓名stringsex;//性別:男,女intage=0;//年齡};2023/11/12964.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生//聲明基類Person的公用派生類Student——大學(xué)生類classStudent:publicPerson{public:usingPerson::Person;//繼承基類Person的構(gòu)造函數(shù)//帶參構(gòu)造函數(shù),在其初始化列表中調(diào)用基類的構(gòu)造函數(shù)Student(stringName,stringSex,intAge,stringId,stringDate,floatScore):Person(Name,Sex,Age),id(Id),date(Date),score(Score){cout<<"TheconstructorofderivedclassStudentiscalled."<<endl;}protected:stringid;//學(xué)號stringdate;//入學(xué)時間floatscore=0.0;//入學(xué)成績};2023/11/1297通常情況下,using聲明語句只是令某個名字在當前作用域內(nèi)可見。而當作用于構(gòu)造函數(shù)時,using聲明語句將令編譯器產(chǎn)生代碼。對于基類的每個構(gòu)造函數(shù),編譯器都生成一個與之對應(yīng)的派生類構(gòu)造函數(shù)。換句話說,對于基類的每個構(gòu)造函數(shù),編譯器都在派生類中生成一個形參列表完全相同的構(gòu)造函數(shù)。這些編譯器生成的構(gòu)造函數(shù)形如:Derived(parms):Base(args){}。4.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生2023/11/1298通常情況下,using聲明語句只是令某個名字在當前作用域內(nèi)可見。而當作用于構(gòu)造函數(shù)時,using聲明語句將令編譯器產(chǎn)生代碼。對于基類的每個構(gòu)造函數(shù),編譯器都生成一個與之對應(yīng)的派生類構(gòu)造函數(shù)。換句話說,對于基類的每個構(gòu)造函數(shù),編譯器都在派生類中生成一個形參列表完全相同的構(gòu)造函數(shù)。這些編譯器生成的構(gòu)造函數(shù)形如:Derived(parms):Base(args){}。4.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生Student(stringName,stringSex,intAge):name(Name),sex(Sex),age(Age){}2023/11/12994.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生1.一個類只能繼承其直接基類的構(gòu)造函數(shù)。2.“繼承”的構(gòu)造函數(shù)的特點:(1)一個構(gòu)造函數(shù)的using聲明不會改變該構(gòu)造函數(shù)的訪問級別一個構(gòu)造函數(shù)的using聲明不會改變該構(gòu)造函數(shù)的訪問級別(2)如果基類的構(gòu)造函數(shù)是explicit或者constexpr,則繼承的構(gòu)造函數(shù)也擁有相同的屬性。(3)當一個基類構(gòu)造函數(shù)含有默認實參時,這些實參并不會被繼承。相反,派生類將獲得多個繼承的構(gòu)造函數(shù),其中每個構(gòu)造函數(shù)分別省略掉一個含有默認實參的形參。注意2023/11/121004.8“繼承”的構(gòu)造函數(shù)第4章繼承與派生2.“繼承”的構(gòu)造函數(shù)的特點:(4)如果基類含有幾個構(gòu)造函數(shù),則除了兩個例外情況,大多數(shù)時候派生類會繼承所有這些構(gòu)造函數(shù)。第一個例外是派生類可以繼承一部分構(gòu)造函數(shù),而為其他構(gòu)造函數(shù)定義自己的版本。如果派生類定義的構(gòu)造函數(shù)與基類的構(gòu)造函數(shù)有相同的參數(shù)列表,則該構(gòu)造函數(shù)將不會被繼承。定義在派生類中的構(gòu)造函數(shù)將替換繼承而來的構(gòu)造函數(shù)。第二個例外是默認、復(fù)制和移動構(gòu)造函數(shù)不會被繼承。如果派生類沒有定義這些構(gòu)造函數(shù),則編譯器將在符合合成條件的情況下為派生類合成它們。繼承的構(gòu)造函數(shù)不會被作為用戶定義的構(gòu)造函數(shù)來使用,因此,如果一個類只含有繼承的構(gòu)造函數(shù),則它也將擁有一個合成的默認構(gòu)造函數(shù)。注意2023/11/12101多重繼承(multipleinheritance,MI)是指派生類具有兩個或兩個以上的直接基類(directclass)。4.9多重繼承第4章繼承與派生2023/11/12102多重繼承可以看做是單繼承的擴展,派生類和每個基類之間的關(guān)系可以看做是一個單繼承。多重繼承派生類的聲明格式如下:class<派生類名>:<繼承方式><基類名1>,…,<繼承方式><基類名n>{<派生類新增加成員>};其中不同的基類可以選擇不同的繼承方式。4.9.1聲明多重繼承的方法第4章繼承與派生2023/11/12103在多重繼承方式下,定義派生類構(gòu)造函數(shù)的一般形式如下:<派生類名>(<總參數(shù)列表>):<基類名1>(<參數(shù)表1>),…,<基類名n>(<參數(shù)表n>){<派生類新增數(shù)據(jù)成員的初始化>};其中,<總參數(shù)表>必須包含完成所有基類數(shù)據(jù)成員初始化所需的參數(shù)。4.9.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第4章繼承與派生2023/11/12104在建立一個派生類對象時,構(gòu)造函數(shù)調(diào)用順序為:先調(diào)用所有基類的構(gòu)造函數(shù),再執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體。所有基類構(gòu)造函數(shù)的調(diào)用順序?qū)凑账鼈冊诶^承方式中的聲明次序調(diào)用,而不是按派生類構(gòu)造函數(shù)參數(shù)初始化列表中的次序調(diào)用。4.9.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第4章繼承與派生2023/11/12105第4章繼承與派生【例4-9】多重繼承派生類的構(gòu)造函數(shù)。教材P1832023/11/12106派生類析構(gòu)函數(shù)的執(zhí)行,多重繼承方式也與單繼承方式類似。派生類析構(gòu)函數(shù)的執(zhí)行順序與其構(gòu)造函數(shù)執(zhí)行順序正好相反.首先執(zhí)行派生類析構(gòu)函數(shù)的函數(shù)體,對派生類新增的數(shù)據(jù)成員所涉及的額外內(nèi)存空間進行清理;然后調(diào)用基類的析構(gòu)函數(shù),對從基類繼承來的成員所涉及的額外內(nèi)存空間進行清理。所有基類的析構(gòu)函數(shù)將按照它們在繼承方式中的聲明次序的逆序、從右到左調(diào)用(與其構(gòu)造函數(shù)執(zhí)行順序正好相反)。4.9.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第4章繼承與派生2023/11/12107繼承的構(gòu)造函數(shù)與多重繼承:在C++11標準中,允許派生類從它的一個或多個基類中繼承構(gòu)造函數(shù)。但是如果從多個基類中繼承了相同的構(gòu)造函數(shù)(即形參列表完全相同)則程序?qū)a(chǎn)生錯誤。這個時候這個類必須為該構(gòu)造函數(shù)定義自己的版本。4.9.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第4章繼承與派生2023/11/121084.9.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第4章繼承與派生classDerived:publicbase1,publicbase2{public:usingbase1::base1;//從base1繼承構(gòu)造函數(shù)//從base2繼承構(gòu)造函數(shù),此時已經(jīng)報錯,試圖從兩個基類中都繼承Derived::Derived(int)usingbase2::base2;//Derived必須自定義一個接受一個int的構(gòu)造函數(shù)Derived(int);//正確,上面的錯誤也消失//一旦Derived定義了它自己的構(gòu)造函數(shù),則Derived的默認構(gòu)造函數(shù)的顯式定義必須出現(xiàn)Derived()=default;};classBase2{public:Base2()=default;Base2(int);};classBase1{public:Base1()=default;Base1(int);};2023/11/12109多重繼承的派生類的復(fù)制與移動:與只有一個基類的繼承一樣,多重繼承的派生類如果定義自己的復(fù)制/移動構(gòu)造函數(shù)和復(fù)制/移動賦值運算符,則必須在完整的對象上執(zhí)行復(fù)制、移動、賦值操作。只有當派生類使用的是合成版本的復(fù)制,移動或賦值成員時,才會自動對其基類部分執(zhí)行這些操作,每個基類分別使用自己的對應(yīng)成員隱式地完成構(gòu)造、賦值工作。4.9.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第4章繼承與派生2023/11/12110在多重繼承方式下,派生類繼承了多個基類的成員。如果在這多個基類中擁有同名的成員,那么,派生類在繼承各個基類的成員之后,當調(diào)用該派生類的這些同名成員時,由于成員標識符不唯一,出現(xiàn)二義性,編譯器無法確定到底應(yīng)該選擇派生類中的哪一個成員,這種由于多重繼承而引起的對派生類的某個成員訪問出現(xiàn)不唯一的情況就稱為二義性問題。4.9.3多重繼承引起的二義性問題第4章繼承與派生2023/11/12111二義性主要分為3種類型:(1)兩個基類有同名成員;(2)兩個基類和派生類三者都有同名成員;(3)兩個基類都從同一個基類派生。4.9.3多重繼承引起的二義性問題第4章繼承與派生2023/11/12燕京理工學(xué)院112第4章繼承與派生(1)兩
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 羽絨服飾行業(yè)美工設(shè)計心得
- 軟件開發(fā)行業(yè)安全生產(chǎn)工作總結(jié)
- 廣東省揭陽市榕城區(qū)2023-2024年六年級上學(xué)期英語期末試卷
- 2023-2024學(xué)年山東省濰坊市高二(下)期中地理試卷
- 2024年廣東省云浮市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2022年黑龍江省牡丹江市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2021年吉林省長春市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2021年河南省安陽市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2024年透閃石項目投資申請報告代可行性研究報告
- 2024年硬質(zhì)合金噴焊粉項目資金籌措計劃書
- 語法辨析-中考語文真題題源解密(遼寧版)(帶答案)
- 山西省晉中市2023-2024學(xué)年高一上學(xué)期期末考試 化學(xué) 含解析
- 2024-2030年中國電子駐車制動器(EPB)行業(yè)發(fā)展現(xiàn)狀及前景趨勢研究報告
- 過程審核表(產(chǎn)品組評分矩陣評審提問表(評分))-2024年百度過
- 操作手冊模板【范本模板】
- 油氣管道泄漏事故應(yīng)急處理方案
- 2025年湖北省武漢市高考數(shù)學(xué)模擬試卷附答案解析
- DB11∕T 353-2021 城市道路清掃保潔質(zhì)量與作業(yè)要求
- 三方代收款委托協(xié)議書范文
- 2023-2024學(xué)年全國小學(xué)二年級上英語人教版期末考試試卷(含答案解析)
- 2024-2030年中國有機蔬菜市場營銷模式建議及供需渠道分析報告
評論
0/150
提交評論