第6講的多態性_第1頁
第6講的多態性_第2頁
第6講的多態性_第3頁
第6講的多態性_第4頁
第6講的多態性_第5頁
已閱讀5頁,還剩60頁未讀 繼續免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第6 6講講 多態性多態性(2)(2)2本講主要內容本講主要內容什么是多態性什么是多態性應用虛函數實現多態性應用虛函數實現多態性純虛函數與抽象類純虛函數與抽象類創建和調用運算符函數創建和調用運算符函數3創建和調用運算符函數創建和調用運算符函數41.運算符重載的需要性運算符重載的需要性 C+認為認為用戶定義的數據類型用戶定義的數據類型就像就像基本數據類型基本數據類型int和和char一樣有效。一樣有效。運算符運算符(如(如+、-、*、/)是為基本數據類型定義的,)是為基本數據類型定義的,為什么不允許為什么不允許用于用于用戶自己定義的類型呢?用戶自己定義的類型呢? 5例如:例如:class A

2、public : A ( int x ) a = x ; /.;A a ( 5 ) , b ( 10 ) , c ;c = a + b ; /類對象也應能運算類對象也應能運算 62. 怎樣進行運算符重載怎樣進行運算符重載運算符運算符是在是在C+系統內部定義的,系統內部定義的,具有特定的具有特定的語法規則,如參數說明,運算順序,優先級語法規則,如參數說明,運算順序,優先級別別等。等。重載運算符時,要注意該重載運算符的運算順重載運算符時,要注意該重載運算符的運算順序和優先級別不變。序和優先級別不變。7如下例:如下例:class A public : A ( int n ) /. operator

3、+ ( A& , A&) /. operator * ( A& , A&) /. / .;A a = 5 , b = 6 ; c = 7 , d = 8 , e;e = a + b * c + d ; /即即 ( a + ( b * c ) + d )8運算符重載運算符重載 “語法修飾語法修飾”有了運算符,編程就顯得方便。例如,對于直有了運算符,編程就顯得方便。例如,對于直角三角形斜邊長度公式角三角形斜邊長度公式c = ,用函數用函數化的格式表示:化的格式表示: c = sqrt ( add ( mult ( a , a ) , mult ( b , b ) )

4、 ) ;用運算符的格式表示:用運算符的格式表示: c = sqrt ( a * a + b * b ) ;22ba 9重載的形式重載的形式運算符是函數運算符是函數,除了運算順序和優先級別不能,除了運算順序和優先級別不能更改外,參數和返回類型是可以重新說明的,更改外,參數和返回類型是可以重新說明的,即可以重載。即可以重載。重載的形式是:重載的形式是: 返回類型返回類型 operator 運算符號(參數說明);運算符號(參數說明);10例如:例如: A類對象的加法:類對象的加法:class A ;int operator + ( A& , A& ) ; /兩個兩個A A類對象參加運

5、算,返回類對象參加運算,返回intint型值型值 11運算符重載的方式運算符重載的方式運算符重載是通過建立運算符函數運算符重載是通過建立運算符函數operator()來實現來實現的。的。運算符函數運算符函數operator( )定義了重載的運算符將要進定義了重載的運算符將要進行的操作,行的操作,這種操作通常作用在一個類上這種操作通常作用在一個類上。運算符函數通常有兩種:運算符函數通常有兩種:類成員運算符函數類成員運算符函數類的友元運算符函數類的友元運算符函數講義上還介紹了運算符的重載第三種方式:講義上還介紹了運算符的重載第三種方式:作為類外的普通函數(很少使用)作為類外的普通函數(很少使用)1

6、23. 建立類成員運算符函數建立類成員運算符函數成員運算符函數的一般聲明格式:成員運算符函數的一般聲明格式:class A /. 返回值類型返回值類型 operator C+運算符運算符(參數表參數表); /.;返回值類型返回值類型 類名類名:operator C+運算符運算符(參數表參數表) 定義將要重載的定義將要重載的C+運算符的操作運算符的操作 13通過成員函數實現運算符的重載通過成員函數實現運算符的重載【例4-1】 通過重載運算符通過重載運算符“”,實現日期類對象,實現日期類對象的的“”比較運算。比較運算。說明:本例以成員函數的方式進行運算符說明:本例以成員函數的方式進行運算符“”的重

7、的重載。載。#include using namespace std;class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);int GetYear();int GetMonth();int GetDay();bool operator(CDate date);比較運算符比較運算符“”的重載的重載關鍵字關鍵字operator函數名是函數名是: operatorCDate:CDate(int nYear, int nMonth, int nDay)m_nYear =

8、 nYear;m_nMonth = nMonth;m_nDay = nDay;int CDate:GetYear()return m_nYear;int CDate:GetMonth()return m_nMonth;int CDate:GetDay()return m_nDay;bool CDate:operator(CDate date) if(m_nYear date.m_nYear)return true;if(m_nYear = date.m_nYear) & (m_nMonth date.m_nMonth)return true;if(m_nYear = date.m_nY

9、ear) & (m_nMonth = date.m_nMonth) & (m_nDay date.m_nDay)return true;return false;int main() CDate date1(1992, 3, 18), date2(1992, 4, 5);if (date1 date2) coutdate1早于早于date2n;elsecoutdate1不早于不早于date2n;return 0; 運算符函數的隱式調用。也可以寫成:運算符函數的隱式調用。也可以寫成:if(date1.operator(date2) /顯式調用顯式調用date1是左操作數是左操作數

10、 date2是右操作數是右操作數比較運算是雙目運算,比較運算是雙目運算,為什么只有一個參數?為什么只有一個參數?請思考。請思考。因為成員運算符函數,參數中隱含的有一個因為成員運算符函數,參數中隱含的有一個thisthis指針,所以對于雙目算符,類成員運算符函數有指針,所以對于雙目算符,類成員運算符函數有一個參數。一個參數。當成員函數重載雙目算符時,有一個參數沒有被當成員函數重載雙目算符時,有一個參數沒有被顯式地傳遞給成員運算符函數顯式地傳遞給成員運算符函數, ,該參數是通過該參數是通過thisthis指針隱含地傳遞給函數的。指針隱含地傳遞給函數的。 17例如例如bool CDate:opera

11、tor(CDate date) if(m_nYear date.m_nYear)return true;if(m_nYear = date.m_nYear) & (m_nMonth date.m_nMonth)return true;if(m_nYear = date.m_nYear) & (m_nMonth = date.m_nMonth) & (m_nDay date.m_nDay)return true;return false;bool CDate:operatorm_nYear m_nYear = date.m_nYear) & (this- m_nM

12、onth m_nYear = date.m_nYear) & (this- m_nMonth = date.m_nMonth) & (this- m_nDay date.m_nDay)return true;return false;18例如例如調用時:調用時:if (date1 date2) 相當于:相當于:if(date1.operator(date2)并相當于:并相當于:if(date1.operator(&date1,date2)194. 建立友元運算符函數建立友元運算符函數 友元運算符函數的聲明格式:友元運算符函數的聲明格式:class A / friend

13、返回值類型返回值類型 operator c+運算符運算符(參數表參數表);返回值類型返回值類型 operator c+運算符運算符(參數表參數表) 定義將要重載的定義將要重載的c+運算符的操作運算符的操作 20通過友元函數實現運算符的重載通過友元函數實現運算符的重載【例4-1補充】 通過重載運算符通過重載運算符“”,實現日期類,實現日期類對象的對象的“”比較運算。比較運算。說明:本例以友元函數的方式進行運算符說明:本例以友元函數的方式進行運算符“”的重的重載。載。/Person.hclass CDate friend bool operator(CDate date1,CDate date2)

14、;/Person.cppbool operator(CDate date1,CDate date2)if(date1.m_nYear date2.m_nYear)return true;if(date1.m_nYear = date2.m_nYear) & (date1.m_nMonth date2.m_nMonth)return true;if(date1.m_nYear = date2.m_nYear) & (date1.m_nMonth = date2.m_nMonth) & (date1.m_nDay date2.m_nDay)return true;retur

15、n false;22注意注意 在在Visual C+6.0)環境中調試該程序,這時會出現與友元運算符重載)環境中調試該程序,這時會出現與友元運算符重載函數有關的編譯錯誤函數有關的編譯錯誤“不能訪問類的私有成員不能訪問類的私有成員”。即所聲明的友元函。即所聲明的友元函數不為編譯器數不為編譯器“認可認可”。為了消除為了消除VC6.0中的這種問題,將中的這種問題,將Person.h文件中的語句文件中的語句#include using namespace std;修改成為:修改成為:#include #include 將將main函數所在文件中的語句函數所在文件中的語句#include using n

16、amespace std;修改成為:修改成為: #include 程序在程序在Visual C+6.0編譯環境下可以正常編譯。編譯環境下可以正常編譯。 235.成員運算符函數和成員運算符函數和友員運算符函數的比較友員運算符函數的比較 對于雙目運算符而言,成員運算符函數帶有對于雙目運算符而言,成員運算符函數帶有一個參數,而友元運算符函數帶有兩個參數;一個參數,而友元運算符函數帶有兩個參數;雙目運算符一般可以被重載為成員運算符函雙目運算符一般可以被重載為成員運算符函數或友元運算符函數,但一種情況(一般數數或友元運算符函數,但一種情況(一般數據類型據類型+ +對象)必須用友元運算符函數。對象)必須用

17、友元運算符函數。 24可以聲明為成員運可以聲明為成員運算符函數算符函數#include class nclass int x,y; public: nclass ( int i = 0 , int j = 0 ) x = i ; y = j ; void show() cout x “,” y endl ; friend nclass operator + ( nclass ob, int m) ; friend nclass operator + ( int m , nclass ob ) ; ;nclass operator +( nclass ob, point m) nclass w;

18、 w.x=ob.x+m; w.y=ob.y+m; return w ;nclass operator +( point m ,nclass ob) nclass w ; w.x= m +ob.x ; w.y=m + ob.y ; return w ;不可以聲明為成員不可以聲明為成員運算符函數運算符函數25void main() nclass ob1(10,20),ob2; ob2=ob1+30; /隱式調用隱式調用 ob2.show(); ob2= operator +( ob1, 30); /顯式調用顯式調用 ob2=50+ob1; /隱式調用隱式調用 ob2.show(); ob2= op

19、erator +( 50, ob1); /顯式調用顯式調用26分析分析ob=ob+200;由于對象由于對象ob是運算符是運算符“+”的左操作數,所以的左操作數,所以它調用了它調用了“+”運算符重載函數;運算符重載函數;ob=300+ob;未能工作的原因是運算符的左操作數是一個整未能工作的原因是運算符的左操作數是一個整數,整數是內部數據類型,它不能產生對一數,整數是內部數據類型,它不能產生對一個類成員函數的調用。個類成員函數的調用。27解決方法解決方法使用友元函數來重載運算符使用友元函數來重載運算符“+”,就能消除由就能消除由于運算符于運算符“+”的左操作數是內部數據類型而的左操作數是內部數據類

20、型而帶來的問題。帶來的問題。這樣這樣,兩個參數都顯式地傳遞給運算符函數。兩個參數都顯式地傳遞給運算符函數。結論:用友元運算符函數來重載運算符結論:用友元運算符函數來重載運算符“+”(或其他雙目運算符)就使得內部數據類型(或其他雙目運算符)就使得內部數據類型能夠出現在運算符的左邊。能夠出現在運算符的左邊。28說明說明C+的大部分運算符既可以被重載為成員運算符函的大部分運算符既可以被重載為成員運算符函數也可以被重載為友元運算符函數。數也可以被重載為友元運算符函數。友元算符函數可增加重載運算符的靈活性。成員友元算符函數可增加重載運算符的靈活性。成員函數重載運算符可以最大程度地保持程序的封裝函數重載運

21、算符可以最大程度地保持程序的封裝性。性。一般說來,對于一目運算符用成員函數重載較好,一般說來,對于一目運算符用成員函數重載較好,對于二目算符用友元算符函數重載恰當。對于二目算符用友元算符函數重載恰當。 29如果一個運算符的操作需要修改類對象的狀態,如果一個運算符的操作需要修改類對象的狀態,則選擇成員運算符函數較好;則選擇成員運算符函數較好;如運算符所需的操作數(第一個操作數)希望有如運算符所需的操作數(第一個操作數)希望有隱式類型轉換,則必須選擇友元運算符函數。隱式類型轉換,則必須選擇友元運算符函數。 30【例例4-2】 通過友元運算符重載函數實現字通過友元運算符重載函數實現字符串常量與日期類

22、對象的比較。符串常量與日期類對象的比較。【分析分析】對于對于左操作數左操作數是基本數據類型,而是基本數據類型,而右操作右操作數數是類對象的情況,例如,將某一字符串常量是類對象的情況,例如,將某一字符串常量“1992.12.18”與某一日期類對象進行比較,就不與某一日期類對象進行比較,就不能使用成員運算符重載函數來實現,其原因在于:能使用成員運算符重載函數來實現,其原因在于: 這時這時左操作數不是類對象,不能調用類的成員函數左操作數不是類對象,不能調用類的成員函數。在這種情況下,需要通過友元函數來實現運算符在這種情況下,需要通過友元函數來實現運算符的重載。的重載。 #include #inclu

23、de class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);int GetYear();int GetMonth();int GetDay();bool operator(CDate date); friend bool operator(const char* strDate, CDate &date); ; 通過友元函數進行比較運算通過友元函數進行比較運算符符的重載的重載這里做了修改(針對這里做了修改(針對VC 6.0編譯環境)編譯環境)32bool

24、 operator(const char* strDate, CDate &date)char strYear5, strMonth3, strDay3;int nYear, nMonth, nDay;strncpy(strYear, strDate, 4); strYear4 = 0;strncpy(strMonth, strDate+5, 2);strMonth2 = 0;strncpy(strDay, strDate+8, 2);strDay2 = 0;nYear = atoi(strYear);nMonth = atoi(strMonth);nDay = atoi(strDay

25、);if(nYear date.m_nYear)return true;if(nYear = date.m_nYear) & (nMonth date.m_nMonth)return true;if(nYear = date.m_nYear) & (nMonth = date.m_nMonth) &(nDay date.m_nDay)return true;return false;33int main()CDate date1(1992, 3, 5), date2(1993, 4, 8);if(date1 date2)coutdate1的日期早于的日期早于date2e

26、ndl;elsecoutdate1的日期不早于的日期不早于date2;CDate date3(1992, 12, 29); if(1992.12.19 date3)coutdate3的日期值晚于:的日期值晚于:1992.12.19endl;elsecoutdate3的日期值不晚于:的日期值不晚于:1992.12.19endl;return 0; 調用成員運算符重載函數:調用成員運算符重載函數:bool operator(CDate date);調用友元運算符重載函數:調用友元運算符重載函數:bool operator(const char* strDate, CDate &date);

27、346. 通過類外的普通函數實現運算符通過類外的普通函數實現運算符的重載的重載【例4-3】重載運算符重載運算符“+”,實現復數的相加。,實現復數的相加。【分析分析】首先定義復數類首先定義復數類CComplex。考慮到。考慮到要使用類外的普通函數來處理復數類內部的要使用類外的普通函數來處理復數類內部的數據,故將數據放在公有域中聲明。數據,故將數據放在公有域中聲明。 這樣僅僅為了重載運算符,明顯破壞了類的這樣僅僅為了重載運算符,明顯破壞了類的封裝性,是很不常見的情形。因為我們有更封裝性,是很不常見的情形。因為我們有更合適的解決問題的辦法,沒有必要合適的解決問題的辦法,沒有必要“犧牲犧牲”類的封裝性

28、。類的封裝性。#include using namespace std;class CComplex public:double m_real;double m_imag;CComplex(double real = 0.0, double imag = 0.0)m_real = real;m_imag = imag;CComplex operator+(const CComplex &complex1, const CComplex &complex2)CComplex temp;temp.m_real = complex1.m_real + complex2.m_real;

29、temp.m_imag = complex1.m_imag + complex2.m_imag;return temp;int main()CComplex complex1(1.2, 2.4), complex2(3.3, 4.4), complex3, complex4;complex3 = complex1 + complex2; coutcomplex3.m_real=complex3.m_real complex3.m_imag=complex3.m_imagendl;complex4 = operator+(complex1, complex2); coutcomplex4.m_r

30、eal=complex4.m_real complex4.m_imag=complex4.m_imagendl;return 0;運算符重載函數的隱式調用運算符重載函數的隱式調用運算符重載函數的顯式調用運算符重載函數的顯式調用387. 單目運算符的重載單目運算符的重載“+”和和“-”w自增運算符自增運算符“+”和自減運算符和自減運算符“-”都是只都是只有一個操作數的單目運算符。有一個操作數的單目運算符。w下面設計一個坐標點類下面設計一個坐標點類CPoint,使用,使用“+”完成完成CPoint類對象的自增運算。類對象的自增運算。【例例4-4】使用成員運算符重載函數實現使用成員運算符重載函數實現

31、CPoint類的自增運算符類的自增運算符“+”的重載。的重載。#include using namespace std;class CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i ; m_y = j ; void show() cout m_x “,” m_y endl ; CPoint operator +( ) ;CPoint CPoint : operator +( ) +m_x; /先增量 +m_y; /先增量 return *this ; /再返回原對象“+” 運算符的重載運算符的重載前綴方式前綴方式v

32、oid main() CPoint point1(100, 100), point2; point1.show( ); point2 =+point1; /隱式調用,像使用基本類型一樣書寫 point2.show(); point1.operator + ( ); /顯式調用,類的成員函數調用格式 point1.show(); 運算結果符合前綴運算結果符合前綴方式方式前綴方式實現了,后前綴方式實現了,后綴方式怎樣實現?綴方式怎樣實現?41【例例4-4補充補充】使用成員運算符重載函數實現使用成員運算符重載函數實現CPoint類的自增運算符類的自增運算符“+”的后綴方式的重的后綴方式的重載。載。【

33、分析分析】前綴方式和后綴方式的區別在于運算當中,是前綴方式和后綴方式的區別在于運算當中,是“先先變變”還是還是“先用先用”。使用時:+ point1 /前綴方式定義時: point1.operator+(); /成員運算符函數使用時: point1 + /后綴方式定義時: point1.operator+(); /成員運算符函數很顯然,在一個類里面出現兩個完全一樣的成員函數是無法很顯然,在一個類里面出現兩個完全一樣的成員函數是無法區分的,那么為了區分開,在后綴方式的定義中加入一個區分的,那么為了區分開,在后綴方式的定義中加入一個參數。參數。42+和和-重載重載在在C+中,編譯器通過在運算符函數

34、參數表中是否插中,編譯器通過在運算符函數參數表中是否插入關鍵字入關鍵字int來區分來區分+或或- - 是前綴方式還是后綴方是前綴方式還是后綴方式。式。+ point1 /前綴方式前綴方式(前面已講)point1.operator+(); /成員運算符函數point1 + /后綴方式后綴方式 point1.operator + ( int ); /成員運算符函數調用時,參數int一般被傳值0。 43#include using namespace std;class CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i

35、; m_y = j ; void show() cout m_x , m_y endl ; CPoint operator +(); /前綴方式前綴方式 CPoint operator +( int i); /后綴方式后綴方式;44CPoint CPoint:operator +( ) +m_x; /先增量先增量 +m_y; /先增量先增量 return *this ; /再返回原對象再返回原對象CPoint CPoint:operator +( int i) CPoint temp(*this); /先將原對象的值保存先將原對象的值保存 m_x+; m_y+; /改變原對象改變原對象 ret

36、urn temp; /返回原對象舊值返回原對象舊值 45void main() CPoint point1(100, 100), point2; point1.show(); /point2 =+point1; point2 = point1+; point2.show(); /point1.operator+(); point1.operator+(1); point1.show(); 46【例例4-5】基于基于CPoint類,使用友元函數重載類,使用友元函數重載前綴自增運算符和后綴自增運算符。前綴自增運算符和后綴自增運算符。#include using namespace std;clas

37、s CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i ; m_y = j ; void show() cout m_x , m_y 訪問)、訪問)、“:”、“.-”、“?:”、“.*”(成員指針逆向引用運算符)(成員指針逆向引用運算符)這五個運算符不能重載,也不能創造新的運算符。這五個運算符不能重載,也不能創造新的運算符。51運算符重載時的要求運算符重載時的要求運算符重載時,應該滿足以下兩個條件:運算符重載時,應該滿足以下兩個條件:不能改變運算符的初始含義;不能改變運算符的初始含義;不能改變運算符的參數數目,但是可

38、以有不能改變運算符的參數數目,但是可以有選擇地省略某個操作數。選擇地省略某個操作數。但可以實現運算符重載函數的重載(為同一個但可以實現運算符重載函數的重載(為同一個運算符定義幾個運算符重載函數來進行不運算符定義幾個運算符重載函數來進行不同的操作)同的操作)52總結:運算符重載的局限性與優點總結:運算符重載的局限性與優點 不能繼承;(不能聲明為虛函數)不能繼承;(不能聲明為虛函數)一般對象之間的運算局限于數據成員是非指針類一般對象之間的運算局限于數據成員是非指針類型;型;運算符重載與相同功能的成員函數或友元函數相運算符重載與相同功能的成員函數或友元函數相比,在隱式調用時更簡潔,這是運算符重載的最

39、比,在隱式調用時更簡潔,這是運算符重載的最明顯的優點。明顯的優點。 538.8.賦值運算符賦值運算符“= =”的重載的重載 只要是用戶定義了類或結構,都應能進行賦值運算,只要是用戶定義了類或結構,都應能進行賦值運算,這也是繼承了這也是繼承了C語言:語言: struct S int a , b ; ;S m , n ;m = n ; /C語言允許這樣賦值語言允許這樣賦值 54數組例外數組例外但是數組名不能賦值,一個數組名代表一個數但是數組名不能賦值,一個數組名代表一個數據類型的集合,實質上是一個常量指針,所據類型的集合,實質上是一個常量指針,所以它不能:以它不能: int a5;int b =

40、3, 5, 7, 9, 11 ;a = b ; /error 55拷貝構造函數和賦值運算符拷貝構造函數和賦值運算符對于任何類,像拷貝構造函數一樣,對于任何類,像拷貝構造函數一樣,C+C+也提供默認也提供默認的賦值運算符函數,但是要區別拷貝構造函數和的賦值運算符函數,但是要區別拷貝構造函數和賦值運算符:賦值運算符: void fn ( MyClass& mc ) MyClass newMC = mc ; /這是拷貝構造函數 newMC = mc ; /這是賦值運算符56區別區別當拷貝構造函數執行時,當拷貝構造函數執行時,newMC對象還不存在,拷對象還不存在,拷貝構造函數起初始化的作用。

41、貝構造函數起初始化的作用。當賦值運算符在當賦值運算符在newMC上執行時,它已經是一個上執行時,它已經是一個MyClass對象。對象。通常,缺省的賦值運算符函數是能夠勝任工作的。但通常,缺省的賦值運算符函數是能夠勝任工作的。但是在某些情況下,如類中有指針類型時,使用缺省是在某些情況下,如類中有指針類型時,使用缺省的賦值運算符函數會產生錯誤。即存在指針懸掛的的賦值運算符函數會產生錯誤。即存在指針懸掛的問題。問題。 57補充例題補充例題#include #include class string char *ptr; public: string ( char *s ) ptr =new charstrlen(s)+1; strcpy(ptr,s); string () delete ptr ; void print () cout ptr endl ; ;void main() stri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論