C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法_第1頁(yè)
C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法_第2頁(yè)
C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法_第3頁(yè)
C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法_第4頁(yè)
C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論