版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法目錄賦值兼容實(shí)例多態(tài)靜多態(tài)動(dòng)多態(tài)格式實(shí)例override純虛函數(shù)含有虛函數(shù)的析構(gòu)函數(shù)注意事項(xiàng)RTTItypeidtypecast多態(tài)實(shí)現(xiàn)虛函數(shù)一般繼承(nooverride)一般繼承(override)過程推斷都說C++是面向?qū)ο蟮恼Z(yǔ)言,其中的面向?qū)ο笾饕ㄈ糠郑豪^承,封裝,多態(tài)。繼承和封裝我們之前就簡(jiǎn)單介紹過,這里主要對(duì)多態(tài)的使用方法做一個(gè)簡(jiǎn)單說明。
賦值兼容
賦值兼容說的是在使用基類對(duì)象的地方可以使用公有繼承類的對(duì)象來代替。賦值兼容是一種默認(rèn)的行為,不需要進(jìn)行顯式轉(zhuǎn)換就能夠?qū)崿F(xiàn)。
就比如在派生類拷貝構(gòu)造函數(shù)的參數(shù)初始化列表中,我們會(huì)直接使用派生類對(duì)象作為基類拷貝構(gòu)造函數(shù)的參數(shù),而不會(huì)報(bào)錯(cuò),這就是賦值兼容的表現(xiàn)。賦值兼容主要表現(xiàn)在:
派生類的對(duì)象可以賦值給基類對(duì)象派生類的對(duì)象可以初始化基類的引用派生類對(duì)象的地址可以賦值給指向基類的指針但,發(fā)生賦值兼容之后,只能使用從基類繼承的成員
實(shí)例
#includeiostream
usingnamespacestd;
classPERSON
public:
PERSON(char*name_="***",charsex_='*')
:name(name_),sex(sex_){}
voiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
}
protected:
char*name;
charsex;
classSTUDENT:publicPERSON
public:
STUDENT(char*name_="***",charsex_='*',char*num_="100")
:PERSON(name_,sex_),num(num_){}
voiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
cout"Thenumis"numendl;
}
private:
char*num;
intmain()
STUDENTst("zhangsan",'x',"100");
st.display();
PERSONper=st;
per.display();
PERSONper2=st;
per2.display();
PERSON*per3=
per3-display();
return0;
}
結(jié)果為:
Thenameiszhangsan
Thesexisx
Thenumis100
Thenameiszhangsan
Thesexisx
Thenameiszhangsan
Thesexisx
Thenameiszhangsan
Thesexisx
上邊的程序可以看出,基類對(duì)象,引用和指針都可以使用派生類對(duì)象或者指針進(jìn)行賦值,從而進(jìn)行訪問。
其實(shí)也可以將基類指針強(qiáng)制轉(zhuǎn)換為派生類指針,進(jìn)行訪問,但這種形式絕不是賦值兼容:
intmain()
PERSONper("zhangsan",'x');
per.display();
STUDENT*st=static_castSTUDENT*(per);
st-display();
return0;
}
結(jié)果為:
Thenameiszhangsan
Thesexisx
Thenameiszhangsan
Thesexisx
Thenumis夽@
上邊的程序中,是將基類的指針強(qiáng)制轉(zhuǎn)換派生類的指針,從而調(diào)用派生類的對(duì)象。
從實(shí)際上來說,該過程只是將以基類地址其實(shí)的一段內(nèi)存交給了派生類的指針,因?yàn)轭悓?duì)象只存儲(chǔ)數(shù)據(jù)成員,因此能夠?qū)?yīng)訪問到從基類繼承到的數(shù)據(jù)成員。但同時(shí)不確定原來基類成員后邊的空間有什么東西,結(jié)果為出現(xiàn)部分亂碼。如果將基類和派生類位置對(duì)調(diào)就是賦值兼容了。
多態(tài)
C++中的多態(tài)主要說的是,在面向?qū)ο笾?,接口的多種不同的實(shí)現(xiàn)方式。
靜多態(tài)
C++中的多態(tài)是接口多種不同的實(shí)現(xiàn)方式。而我們之前提到過的函數(shù)重載也是接口的多種不同的實(shí)現(xiàn)方式,因此也可以稱之為多態(tài),只是函數(shù)重載是在編譯階段通過namemangling實(shí)現(xiàn)的,所以叫做靜多態(tài)。
動(dòng)多態(tài)
而不在編譯階段而是在運(yùn)行階段決定的多態(tài)就稱為動(dòng)多態(tài)。動(dòng)多態(tài)的形成條件為:
父類中有虛函數(shù)子類override父類中的的虛函數(shù)通過已被子類對(duì)象賦值的父類指針或引用,調(diào)用公有接口
格式
classclassname
virtualdatatypefunc(argu);
}
#includeiostream
usingnamespacestd;
classPERSON
public:
PERSON(char*name_="***",charsex_='*')
:name(name_),sex(sex_){}
virtualvoiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
}
protected:
char*name;
charsex;
classSTUDENT:publicPERSON
public:
STUDENT(char*name_="***",charsex_='*',char*num_="100")
:PERSON(name_,sex_),num(num_){}
virtualvoiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
cout"Thenumis"numendl;
}
protected:
char*num;
classPOSTGRADUATE:publicSTUDENT
public:
POSTGRADUATE(char*name_="***",charsex_='*',char*num_="***",char*job_="***")
:STUDENT(name_,sex_,num_),job(job_){}
virtualvoiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
cout"Thenumis"numendl;
cout"Thejobis"jobendl;
}
protected:
char*job;
intmain()
POSTGRADUATEpo("zhsangsan",'x',"100","paper");
po.display();
PERSON*per=
per-display();
STUDENT*st=
st-display();
return0;
}
結(jié)果為:
Thenameiszhsangsan
Thesexisx
Thenumis100
Thejobispaper
Thenameiszhsangsan
Thesexisx
Thenumis100
Thejobispaper
Thenameiszhsangsan
Thesexisx
Thenumis100
Thejobispaper
在基類中聲明虛函數(shù)時(shí)需要使用virtual關(guān)鍵字,在類外實(shí)現(xiàn)虛函數(shù)時(shí),不用再加virtual
在派生類中重新定義此函數(shù)的過程稱為override,此過程要求函數(shù)的要素全都不能發(fā)生改變,包括函數(shù)名,返回值類型,形參個(gè)數(shù)和類型,只有函數(shù)體可以改變
當(dāng)基類中的函數(shù)成員被聲明為virtual時(shí),其派生類中完全相同的函數(shù)都會(huì)變?yōu)樘摵瘮?shù),原則上派生類中的虛函數(shù)不用使用virtual關(guān)鍵字,但是為了程序的可讀性,可以在派生類的對(duì)應(yīng)函數(shù)前加上virtual
定義一個(gè)指向基類的指針,并使其指向其子類對(duì)象的地址,通過該指針調(diào)用虛函數(shù),此時(shí)調(diào)用的就是指針變量指向的對(duì)象
子類中override的函數(shù),可以為任意訪問類型
通過多態(tài)就避免了賦值兼容的問題
override
在虛函數(shù)的使用中,需要在派生類中override基類中的虛函數(shù),表明該函數(shù)是從基類override得到的,override的含義表明:
override的函數(shù)要素全都不能發(fā)生改變包括函數(shù)名,返回值類型,形參個(gè)數(shù)和類型只有函數(shù)體可以改變
而有時(shí)為了可讀性,也為了防止編寫時(shí)出錯(cuò),可以通過在函數(shù)后添加override關(guān)鍵字表明這是override得到的。如上邊的例子中:
virtualvoiddisplay()override
使用上邊的形式可以嚴(yán)格語(yǔ)法書寫。
純虛函數(shù)
對(duì)于一些抽象基類來說,我們并不需要在其中的虛函數(shù)中編寫什么語(yǔ)句,因此可以將之寫成純虛函數(shù)。
classclassname
virtualdatatypefunc(argu)=0;
}
如上例所示,可以將STUDENT中的display函數(shù)定義為純虛函數(shù):
virtualvoiddisplay()=0;
只是此時(shí)不能夠調(diào)用STUDENT中的該函數(shù)了。
對(duì)于純虛函數(shù)而言:
含有純虛函數(shù)的類,稱為抽象基類,不能夠創(chuàng)建該類對(duì)象,該類只能被繼承,提供公共接口純虛函數(shù)的聲明形式就包含了聲明和實(shí)現(xiàn)如果一個(gè)類中聲明了純虛函數(shù),而在派生類中沒有定義該函數(shù),則該虛函數(shù)在派生類中仍然是純虛函數(shù),派生類仍然為抽象基類,這意味著在第一次繼承的時(shí)候一定要定義該函數(shù)從這個(gè)角度看,才算是虛函數(shù)的正確用法,直接用來聲明為純虛基類,從而被繼承
含有虛函數(shù)的析構(gòu)函數(shù)
含有虛函數(shù)的類,析構(gòu)函數(shù)也應(yīng)該聲明為虛函數(shù)。
#includeiostream
usingnamespacestd;
classPERSON
public:
PERSON(char*name_="***",charsex_='*')
:name(name_),sex(sex_){}
virtualvoiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
}
~PERSON(){cout"PERSON"endl;}
protected:
char*name;
charsex;
classSTUDENT:publicPERSON
public:
STUDENT(char*name_="***",charsex_='*',char*num_="100")
:PERSON(name_,sex_),num(num_){}
virtualvoiddisplay()
{
cout"Thenameis"nameendl;
cout"Thesexis"sexendl;
cout"Thenumis"numendl;
}
~STUDENT(){cout"STUDENT"endl;}
protected:
char*num;
intmain()
{
STUDENTst("zhsangsan",'x',"100");
st.display();
}
cout"****************"endl;
PERSON*p=newSTUDENT("zhsangsan",'x',"100");
p-display();
deletep;
return0;
}
結(jié)果為:
Thenameiszhsangsan
Thesexisx
Thenumis100
STUDENT
PERSON
****************
Thenameiszhsangsan
Thesexisx
Thenumis100
PERSON
此時(shí)如果將析構(gòu)函數(shù)聲明為virtual:
virtual~PERSON(){cout"PERSON"endl;}
結(jié)果為:
Thenameiszhsangsan
Thesexisx
Thenumis100
STUDENT
PERSON
****************
Thenameiszhsangsan
Thesexisx
Thenumis100
STUDENT
PERSON
可以看出,對(duì)于堆對(duì)象來說,含有虛函數(shù)的類對(duì)象析構(gòu)與棧對(duì)象析構(gòu)是有所差別的。為了防止這種情況出現(xiàn),最好是將含有虛函數(shù)的析構(gòu)函數(shù)聲明為virtual。
注意事項(xiàng)
因?yàn)樘摵瘮?shù)是用在繼承中的,因此只有類成員函數(shù)才能聲明為虛函數(shù)靜態(tài)成員函數(shù)不能是虛函數(shù)內(nèi)聯(lián)函數(shù)不能是虛函數(shù)構(gòu)造函數(shù)不能是虛函數(shù)析構(gòu)函數(shù)可以是虛函數(shù)且通常聲明為虛函數(shù)
RTTI
(RunTimeTypeIdentification,RTTI)也叫運(yùn)行時(shí)類型信息,也是通過多態(tài)實(shí)現(xiàn)的。
typeid
typeid返回包含操作數(shù)數(shù)據(jù)類型信息的type_info對(duì)象的一個(gè)引用,信息中包括數(shù)據(jù)類型的名稱。要使用typeid,需要在函數(shù)中包含:
#includetypeinfo
type_info重載了操作符==,!=用來進(jìn)行比較函數(shù)name()返回類型名稱type_info的拷貝和賦值都是私有的,因此不可拷貝和賦值
#includeiostream
#includetypeinfo
usingnamespacestd;
typedefvoid(*Func)();
classBase1
classBase2
public:
virtual~Base2(){}
classDerive1:publicBase1
classDerive2:publicBase2
intmain()
couttypeid(int).name()endl;
couttypeid(double).name()endl;
couttypeid(char*).name()endl;
couttypeid(char**).name()endl;
couttypeid(constchar*).name()endl;
couttypeid(constchar*const).name()endl;
cout"********************"endl;
couttypeid(Func).name()endl;
couttypeid(Base1).name()endl;
couttypeid(Base2).name()endl;
couttypeid(Derive1).name()endl;
couttypeid(Derive2).name()endl;
cout"********************"endl;
Derive1d;
Base1b=d;
couttypeid(b).name()endl;
couttypeid(d).name()endl;
cout"********************"endl;
Derive2dd;
Base2bb=dd;
couttypeid(bb).name()endl;
couttypeid(dd).name()endl;
cout"********************"endl;
Base1*p=
couttypeid(p).name()endl;
couttypeid(*p).name()endl;
couttypeid(d).name()endl;
coutboolalpha(typeid(*p)==typeid(d))endl;
cout"********************"endl;
Base2*pp=
couttypeid(pp).name()endl;
couttypeid(*pp).name()endl;
couttypeid(dd).name()endl;
coutboolalpha(typeid(*pp)==typeid(dd))endl;
cout"********************"endl;
return0;
}
結(jié)果為:
i
d
Pc
PPc
PKc
PKc
********************
PFvvE
5Base1
5Base2
7Derive1
7Derive2
********************
5Base1
7Derive1
********************
7Derive2
7Derive2
********************
P5Base1
5Base1
7Derive1
false
********************
P5Base2
7Derive2
7Derive2
true
********************
從上邊可以看出,在typeid涉及到虛函數(shù)時(shí),利用指針得到的結(jié)果就可能出現(xiàn)差別,因此在使用typeid時(shí)需要注意:
確?;愔兄辽俣x了一個(gè)虛函數(shù)(虛析構(gòu)也可)在涉及到虛函數(shù)時(shí),盡量不要將typeid應(yīng)用于指針,而是應(yīng)用于引用,或者解引用的指針typeid是一個(gè)運(yùn)算符,而不是函數(shù)typeid運(yùn)算符返回的type_info類型,其拷貝構(gòu)造函數(shù)和賦值運(yùn)算函數(shù)都聲明為private,因此不能用于stl容器。也因此我們一般不直接保存type_info,而是保存type_info的name信息
Noticehowthetypethattypeidconsidersforpointersisthepointertypeitself(bothaandbareoftypeclassBase*).However,whentypeidisappliedtoobjects(like*aand*b)typeidyieldstheirdynamictype(i.e.thetypeoftheirmostderivedcompleteobject).
Ifthetypetypeidevaluatesisapointerprecededbythedereferenceoperator(*),andthispointerhasanullvalue,typeidthrowsabad_typeidexception.
typecast
在之前的文章中,我們簡(jiǎn)單介紹過static_cast,reininterpreter_cast,const_cast的用法,當(dāng)時(shí)還剩下一個(gè)dynamic_cast。
dynamic_cast是一種運(yùn)行時(shí)的類型轉(zhuǎn)換方式,因此用于運(yùn)行時(shí)的轉(zhuǎn)換判斷。該轉(zhuǎn)換能夠檢查指針?biāo)赶虻念愋?,然后判斷這一類型與轉(zhuǎn)換的目標(biāo)類型是否相同,如果是返回對(duì)象地址,如果不是返回NULL。
dynamic_cast常用于多態(tài)繼承中,來判斷父類指針的真實(shí)指向。
#includeiostream
#includetypeinfo
usingnamespacestd;
classA
public:
virtual~A(){}
classB:publicA
classC:publicA
classD
intmain()
Bb;
A*pa=
B*pb=dynamic_castB*(pa);//成功
coutpbendl;
C*pc=dynamic_castC*(pa);//成功安全
coutpcendl;
D*pd=dynamic_castD*(pa);//成功安全
coutpdendl;
pb=static_castB*(pa);//成功
coutpbendl;
pc=static_castC*(pa);//成功不安全
coutpcendl;
pb=reinterpret_castB*(pa);//成功不安全
coutpbendl;
pc=reinterpret_castC*(pa);//成功不安全
coutpcendl;
pd=reinterpret_castD*(pa);//成功不安全
coutpdendl;
return0;
}
結(jié)果為:
0x61fe8c
0
0
0x61fe8c
0x61fe8c
0x61fe8c
0x61fe8c
0x61fe8c
在上述幾種類型轉(zhuǎn)換中,dynamic_cast的轉(zhuǎn)換用法算是比較安全的,因?yàn)檫@種轉(zhuǎn)換方式是先比較再返回的,而reininterpreter_cast則是最不安全的,因?yàn)檫@種轉(zhuǎn)換方式不做類型檢查直接將源類型重新解釋為目標(biāo)類型,容易出錯(cuò)。
但dynamic_cast的目標(biāo)類型必須是類的指針或者引用。
多態(tài)實(shí)現(xiàn)
虛函數(shù)
之前介紹函數(shù)重載,也就是靜多態(tài)是通過namemangling實(shí)現(xiàn)的,而C++的動(dòng)多態(tài)則是通過虛函數(shù)表(virtualtable)實(shí)現(xiàn)的。這個(gè)表中主要是一個(gè)類的虛函數(shù)的地址表,這張表包含了繼承,override的情況。在實(shí)際使用中,在含有虛函數(shù)的類對(duì)象中,該表會(huì)被分配到該對(duì)象的內(nèi)存中,用于指明實(shí)際所要調(diào)用的函數(shù)。
C++編譯器保證虛函數(shù)表的指針存在于實(shí)例對(duì)象的最前面,這表示實(shí)例對(duì)象的地址就是該虛函數(shù)表的位置,然后就可以遍歷其中的函數(shù)指針,進(jìn)行調(diào)用。
#includeiostream
#includetypeinfo
usingnamespacestd;
classBase
public:
voidf(){cout"Base::f"endl;}
voidg(){cout"Base::g"endl;}
voidh(){cout"Base::h"endl;}
private:
intdata;
intmain()
Baseb;
cout"sizeof(Base)="sizeof(Base)endl;
cout"sizeof(b)="sizeof(b)endl;
return0;
}
結(jié)果為:
sizeof(Base)=4
sizeof(b)=4
如果基類中存在虛函數(shù),則為:
#includeiostream
#includetypeinfo
usingnamespacestd;
classBase
public:
virtualvoidf(){cout"Base::f"endl;}
virtualvoidg(){cout"Base::g"endl;}
virtualvoidh(){cout"Base::h"endl;}
private:
intdata;
intmain()
Baseb;
cout"sizeof(Base)="sizeof(Base)endl;
cout"sizeof(b)="sizeof(b)endl;
return0;
}
結(jié)果為:
sizeof(Base)=8
sizeof(b)=8
可以看出有虛函數(shù)的基類的大小會(huì)比沒有虛函數(shù)的基類大小多出一個(gè)指針的大小。這個(gè)多出來的指針就是虛函數(shù)表的位置。
#includeiostream
#includetypeinfo
usingnamespacestd;
classBase
public:
virtualvoidf(){cout"Base::f"endl;}
virtualvoidg(){cout"Base::g"endl;}
virtualvoidh(){cout"Base::h"endl;}
private:
intdata;
typedefvoid(*FUNC)(void);
intmain()
Baseb;
cout"sizeof(Base)="sizeof(Base)endl;
cout"sizeof(b)="sizeof(b)endl;
coutbendl;
cout*((int**)*(int*)(b)+0)endl;
cout*((int**)*(int*)(b)+1)endl;
cout*((int**)*(int*)(b)+2)endl;
cout*((int**)*(int*)(b)+3)endl;
FUNCpf=NULL;
pf=(FUNC)*((int**)*(int*)(b)+0);
pf();
pf=(FUNC)*((int**)*(int*)(b)+1);
pf();
pf=(FUNC)*((int**)*(int*)(b)+2);
pf();
return0;
}
結(jié)果為:
sizeof(Base)=8
sizeof(b)=8
0x61fe94
0x4029f0
0x402a24
0x402a58
0x3a434347
Base::f
Base::g
Base::h
上面的程序中:
先將b轉(zhuǎn)換為int*(這樣能夠保證+1一次增加一個(gè)指針的大小),取得虛函數(shù)表的地址然后,再次取址就得到了第一個(gè)虛函數(shù)的地址,也就是Base::f最后再轉(zhuǎn)換為int**,通過+1,+2后取址,就能夠得到Base::g,Base::h
一般繼承(nooverride)
#includeiostream
#includetypeinfo
usingnamespacestd;
classBase
public:
virtualvoidf(){cout"Base::f"endl;}
virtualvoidg(){cout"Base::g"endl;}
virtualvoidh(){cout"Base::h"endl;}
private:
intdata;
classDerive:publicBase
virtualvoidf1(){cout"Base::f1"endl;}
virtualvoidg1(){cout"Base::g1"endl;}
virtualvoidh1(){cout"Base::h1"endl;}
typedefvoid(*FUNC)(void);
intmain()
Deriveb;
cout"sizeof(Base)="sizeof(Base)endl;
cout"sizeof(Derive)="sizeof(Derive)endl;
cout"sizeof(b)="sizeof(b)endl;
coutbendl;
cout*((int**)*(int*)(b)+0)endl;
cout*((int**)*(int*)(b)+1)endl;
cout*((int**)*(int*)(b)+2)endl;
cout*((int**)*(int*)(b)+3)endl;
cout*((int**)*(int*)(b)+4)endl;
cout*((int**)*(int*)(b)+5)endl;
cout*((int**)*(int*)(b)+6)endl;
FUNCpf=NULL;
pf=(FUNC)*((int**)*(int*)(b)+0);
pf();
pf=(FUNC)*((int**)*(int*)(b)+1);
pf();
pf=(FUNC)*((int**)*(int*)(b)+2);
pf();
pf=(FUNC)*((int**)*(int*)(b)+3);
pf();
pf=(FUNC)*((int**)*(int*)(b)+4);
pf();
pf=(FUNC)*((int**)*(int*)(b)+5);
pf();
return0;
}
結(jié)果為:
sizeof(Base)=8
sizeof(Derive)=8
sizeof(b)=8
0x61fe94
0x402ae0
0x402b14
0x402b48
0x402b94
0x402bc8
0x402bfc
0x3a434347
Base::f
Base::g
Base::h
Base::f1
Base::g1
Base::h1
在上邊的例子中,派生類沒有override任何父類的函數(shù),并又重新定義了幾個(gè)虛函數(shù),因此對(duì)于派生類來說:
虛函數(shù)按照其聲明順序在表中存放父類的虛函數(shù)在子類的虛函數(shù)前邊
一般繼承(override)
#includeiostream
#includetypeinfo
usingnamespa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)要領(lǐng):網(wǎng)站性能優(yōu)化關(guān)鍵點(diǎn)
- 2026年公共關(guān)系管理情境模擬題媒體溝通策略題目
- 2026年審計(jì)專業(yè)認(rèn)證試題GJB與ISO雙重標(biāo)準(zhǔn)下的審計(jì)題
- 2026年綠色能源市場(chǎng)與投資策略試題集
- 2026年烹飪技能競(jìng)賽經(jīng)典菜肴制作標(biāo)準(zhǔn)題
- 2026年會(huì)員營(yíng)銷策略有效性測(cè)試題
- 2026年測(cè)試工程師基礎(chǔ)知識(shí)與進(jìn)階知識(shí)測(cè)試題
- 2026年外語(yǔ)翻譯技能與教學(xué)方法試題集
- 2026年建筑師執(zhí)業(yè)資格考試題庫(kù)建筑設(shè)計(jì)與實(shí)踐操作指南
- 2025 小學(xué)二年級(jí)道德與法治上冊(cè)友好交流使用禮貌用語(yǔ)對(duì)話更和諧更有禮課件
- 深圳大疆在線測(cè)評(píng)行測(cè)題庫(kù)
- 金屬?gòu)S生產(chǎn)制度
- 2026安徽淮北市特種設(shè)備監(jiān)督檢驗(yàn)中心招聘專業(yè)技術(shù)人員4人參考題庫(kù)及答案1套
- 2025年航空行業(yè)空客智能制造報(bào)告
- 蒙牛乳業(yè)股份有限公司盈利能力分析
- 2025民航西藏空管中心社會(huì)招聘14人(第1期)筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- (新教材)2026年人教版八年級(jí)下冊(cè)數(shù)學(xué) 21.2.1 平行四邊形及其性質(zhì) 課件
- 設(shè)備保養(yǎng)維護(hù)規(guī)程
- 2025年?yáng)|營(yíng)中考物理真題及答案
- DL-T+5860-2023+電化學(xué)儲(chǔ)能電站可行性研究報(bào)告內(nèi)容深度規(guī)定
- GB/T 46425-2025煤矸石山生態(tài)修復(fù)技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論