《所有分類c》PPT課件.ppt_第1頁
《所有分類c》PPT課件.ppt_第2頁
《所有分類c》PPT課件.ppt_第3頁
《所有分類c》PPT課件.ppt_第4頁
《所有分類c》PPT課件.ppt_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1,第七章 繼承與派生,類的繼承與派生 類成員的訪問控制 類型兼容規(guī)則 單繼承與多繼承 派生類的構(gòu)造、析構(gòu)函數(shù) 類成員的標識與訪問 深度探索 下半場,2,類的繼承與派生,保持已有類的特性而構(gòu)造新類的過程稱為繼承。 在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生。 被繼承的已有類稱為基類(或父類)。 派生出的新類稱為派生類。,3,繼承與派生問題舉例,類的繼承與派生,4,繼承與派生問題舉例,類的繼承與派生,貓科,5,繼承與派生問題舉例,類的繼承與派生,6,繼承與派生問題舉例,類的繼承與派生,7,繼承與派生的目的,繼承的目的:實現(xiàn)代碼重用。 派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不

2、能完全解決)時,需要對原有程序進行改造。,類的繼承與派生,8,派生類的聲明,class 派生類名:繼承方式 基類名 成員聲明; ,類的繼承與派生,9,繼承方式,不同繼承方式的影響主要體現(xiàn)在: 派生類成員對基類成員的訪問權(quán)限 通過派生類對象對基類成員的訪問權(quán)限 三種繼承方式 公有繼承 私有繼承 保護繼承,類成員的訪問控制,10,公有繼承(public),基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的private成員不可直接訪問。 派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。 通過派生類的對

3、象只能訪問基類的public成員。,類成員的訪問控制,11,例7-1 公有繼承舉例,/Rectangle.h class Point/基類Point類的聲明 public:/公有函數(shù)成員 void InitPoint(float x=0, float y=0) this-x = x; this-y = y; void Move(float xOff, float yOff) x += xOff; y += yOff; float GetX() return x; float GetY() return x; private:/私有數(shù)據(jù)成員 float x, y; ;/end class Poi

4、nt,類成員的訪問控制,class Rectangle: public Point/派生類聲明部分 public:/新增公有函數(shù)成員 void InitRectangle(float x, float y, float w, float h) InitPoint(x, y); /調(diào)用基類公有成員函數(shù) this-w = w; this-h = h; /InitRectangle float GetH() return h; float GetW() return w; private:/新增私有數(shù)據(jù)成員 float w,h; ;/end class Rectangle /end of Recta

5、ngle.h,12,/7_1.cpp #include #include #include rectangle.h using namespace std; void main(void) Rectangle rect; /聲明Rectangle類的對象 rect.InitRectangle(2,3,20,10); /設(shè)置矩形的數(shù)據(jù) rect.Move(3,2); /移動矩形位置 cout The data of rect(x,y,w,h): endl; cout rect.GetX() , /輸出矩形的特征參數(shù) rect.GetY() , rect.GetW() , rect.GetH()

6、endl; /main,13,14,私有繼承(private),基類的public和protected成員都以private身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。 派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。 通過派生類的對象不能直接訪問基類中的任何成員。,類成員的訪問控制,15,例7-2 私有繼承舉例,/rectangle.h /基類Point類的聲明 class Rectangle: private Point/派生類聲明部分 public:/新增公有函數(shù)成員 void InitRectangle

7、(float x, float y, float w, float h) InitPoint(x, y); /調(diào)用基類公有成員函數(shù) this-w = w; this-h = h; /InitRectangle void Move(float xOff,float yOff)Point:Move(xOff,yOff); float GetX() return Point:GetX(); float GetY() return Point:GetY(); float GetH() return h; float GetW() return w; private:/新增私有數(shù)據(jù)成員 float w,

8、h; ;/end class Rectangle,類成員的訪問控制,/7_2.cpp #include #include #include rectangle.h using namespace std; void main(void) Rectangle rect; /聲明Rectangle類的對象 rect.InitRectangle(2,3,20,10); /設(shè)置矩形的數(shù)據(jù) rect.Move(3,2); /移動矩形位置 cout The data of rect(x,y,w,h): endl; cout rect.GetX() , /輸出矩形的特征參數(shù) rect.GetY() , re

9、ct.GetW() , rect.GetH() endl; /main,16,17,保護繼承(protected),基類的public和protected成員都以protected身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。 派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。 通過派生類的對象不能直接訪問基類中的任何成員,類成員的訪問控制,18,protected 成員的特點與作用,對建立其所在類對象的模塊來說,它與 private 成員的性質(zhì)相同。 對于其派生類來說,它與 public 成員的性質(zhì)相同。 既實現(xiàn)

10、了數(shù)據(jù)隱藏,又方便繼承,實現(xiàn)代碼重用。,類成員的訪問控制,19,protected 成員舉例,class A protected: int x; ; void main(void) A a; a.x = 5; /錯誤 /main,類成員的訪問控制,class A protected: int x; ; class B: public A public: void func(); ; void B:func() x = 5; /正確 ,20,類型兼容規(guī)則,一個公有派生類的對象在使用上可以被當(dāng)作基類的對象,反之則禁止。具體表現(xiàn)在: 派生類的對象可以隱含轉(zhuǎn)換為基類對象。 派生類的對象可以初始化基類的

11、引用。 派生類的指針可以隱含轉(zhuǎn)換為基類的指針。 通過基類對象名、指針只能使用從基類繼承的成員,類型兼容,21,例7-3 類型兼容規(guī)則舉例,#include using namespace std; class Base1 /基類Base1定義 public: void display() const cout Base1:display() endl; ;/end class Base1,類型兼容,class Base2: public Base1 /公有派生類Base2定義 public: void display() const cout display();/對象指針-成員名 /fun,

12、22,void main(void) /主函數(shù) Base1 base1; /聲明Base1類對象 Base2 base2; /聲明Base2類對象 Derived derived;/聲明Derived類對象 /用Base1對象的指針調(diào)用fun函數(shù) fun( /main,運行結(jié)果: Base1:display() Base1:display() Base1:display(),23,24,基類與派生類的對應(yīng)關(guān)系,單繼承 派生類只從一個基類派生。 多繼承 派生類從多個基類派生。 多重派生 由一個基類派生出多個不同的派生類。 多層派生 派生類又作為基類,繼續(xù)派生新的類。,單繼承與多繼承,25,多繼承

13、時派生類的聲明,class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,. 成員聲明; 注意:每一個“繼承方式”,只用于限制緊隨其后之基類的繼承。,單繼承與多繼承,26,多繼承舉例,class A public: void setA(int); void showA() const; private: int a; ; /end class A class B public: void setB(int); void showB() const;,private: int b; ; /end class B class C : public A, private B public:

14、void setC(int,int,int); void showC() const; private const: int c; ; /end class C,單繼承與多繼承,void A:setA(int x) a = x; /setA void B:setB(int x) b = x; /setB void C:setC(int x, int y, int z) /派生類成員直接訪問基類的公有成員 setA(x); setB(y); c = z; /setC /其他函數(shù)實現(xiàn)略,/主函數(shù) void main(void) C obj; obj.setA(5); obj.showA(); ob

15、j.setC(6,7,9); obj.showC(); / obj.setB(6); 錯誤 / obj.showB(); 錯誤 /main,27,28,繼承時的構(gòu)造函數(shù),基類的構(gòu)造函數(shù)不被繼承,派生類中需要聲明自己的構(gòu)造函數(shù)。 定義構(gòu)造函數(shù)時,只需要對本類中新增成員進行初始化,對繼承來的基類成員的初始化,自動調(diào)用基類構(gòu)造函數(shù)完成。 派生類的構(gòu)造函數(shù)需要給基類的構(gòu)造函數(shù)傳遞參數(shù),派生類的構(gòu)造、析構(gòu)函數(shù),29,單一繼承時的構(gòu)造函數(shù),派生類名:派生類名(基類所需的形參,本類成員所需的形參):基類名(參數(shù)表) 本類成員初始化賦值語句; ;,派生類的構(gòu)造、析構(gòu)函數(shù),30,單一繼承時的構(gòu)造函數(shù)舉例,#in

16、clude using namespace std; class B public: B(); B(int i); B(); void print() const; private: int b; ; /class B,派生類的構(gòu)造、析構(gòu)函數(shù),B:B() b=0; cout Bs default constructor called. endl; /B() B:B(int i) b=i; cout Bs constructor called. endl; /B(int) B:B() cout Bs destructor called. endl; /B() void B:print() con

17、st cout b endl; /print,31,class C: public B public: C(); C(int i, int j); C(); void print() const; private: int c; ; /class C,32,C:C() c = 0; cout Cs default constructor called. endl; /C() C:C(int i,int j): B(i) c = j; cout Cs constructor called. endl; /C(int,int) C:C() cout Cs destructor called. en

18、dl; /C() void C:print() const B:print(); cout c endl; /print void main(void) C obj(5, 6); obj.print(); /main,33,輸出結(jié)果: Bs constructor called. Cs constructor called. 5 6 Cs destructor called. Bs destructor called.,34,多繼承時的構(gòu)造函數(shù),派生類名:派生類名(參數(shù)表):基類名1(基類1初始化參數(shù)表), 基類名2(基類2初始化參數(shù)表), .基類名n(基類n初始化參數(shù)表) 本類成員初始化賦值

19、語句; ;,派生類的構(gòu)造、析構(gòu)函數(shù),35,派生類與基類的構(gòu)造函數(shù),當(dāng)基類中聲明有缺省構(gòu)造函數(shù)或未聲明構(gòu)造函數(shù)時,派生類構(gòu)造函數(shù)可以不向基類構(gòu)造函數(shù)傳遞參數(shù),也可以不聲明,構(gòu)造派生類的對象時,基類的缺省構(gòu)造函數(shù)將被調(diào)用。 當(dāng)需要執(zhí)行基類中帶形參的構(gòu)造函數(shù)來初始化基類數(shù)據(jù)時,派生類構(gòu)造函數(shù)應(yīng)在初始化列表中為基類構(gòu)造函數(shù)提供參數(shù)。,派生類的構(gòu)造、析構(gòu)函數(shù),36,多繼承且有內(nèi)嵌對象時的構(gòu)造函數(shù),派生類名:派生類名(形參表):基類名1(參數(shù)), 基類名2(參數(shù)), .基類名n(參數(shù)),新增成員對象的初始化 本類成員初始化賦值語句; ;,派生類的構(gòu)造、析構(gòu)函數(shù),37,構(gòu)造函數(shù)的執(zhí)行順序,1 調(diào)用基類構(gòu)造函

20、數(shù),調(diào)用順序按照它們被繼承時聲明的順序(從左向右)。 2 對成員對象進行初始化,初始化順序按照它們在類中聲明的順序。 3執(zhí)行派生類的構(gòu)造函數(shù)體中的內(nèi)容。,派生類的構(gòu)造、析構(gòu)函數(shù),38,拷貝構(gòu)造函數(shù),若建立派生類對象時沒有編寫拷貝構(gòu)造函數(shù),編譯器會生成一個隱含的拷貝構(gòu)造函數(shù),該函數(shù)先調(diào)用基類的拷貝構(gòu)造函數(shù),再為派生類新增的成員對象執(zhí)行拷貝。 若編寫派生類的拷貝構(gòu)造函數(shù),則需要為基類相應(yīng)的拷貝構(gòu)造函數(shù)傳遞參數(shù)。例如: C:C(C class B1 /基類B1,構(gòu)造函數(shù)有參數(shù) public: B1(int i) cout constructing B1 i endl; ;/end class B1

21、class B2 /基類B2,構(gòu)造函數(shù)有參數(shù) public: B2(int j) cout constructing B2 j endl; ;/end class B2 class B3 /基類B3,構(gòu)造函數(shù)無參數(shù) public: B3()cout constructing B3 * endl; ;/end class B3,派生類的構(gòu)造、析構(gòu)函數(shù),class C: public B2, public B1, public B3 /派生新類C /注意基類名的順序 public:/派生類的公有成員 C(int a, int b, int c, int d ):B1(a), memberB2(d)

22、, memberB1(c), B2(b) /注意基類名的個數(shù)與順序 /注意成員對象名的個數(shù)與順序 private:/派生類的私有對象成員 B1 memberB1; B2 memberB2; B3 memberB3; ;/end class C void main(void) C obj(1,2,3,4); /main,運行結(jié)果: constructing B2 2 constructing B1 1 constructing B3 * constructing B1 3 constructing B2 4 constructing B3 *,40,41,繼承時的析構(gòu)函數(shù),析構(gòu)函數(shù)也不被繼承,派

23、生類自行聲明 聲明方法與一般(無繼承關(guān)系時)類的析構(gòu)函數(shù)相同。 不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系統(tǒng)會自動隱式調(diào)用。 析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反。,派生類的構(gòu)造、析構(gòu)函數(shù),42,例7-5 派生類析構(gòu)函數(shù)舉例,派生類的構(gòu)造、析構(gòu)函數(shù),#include using namespace std; class B1 /基類B1 public: B1(int i) cout constructing B1 i endl; B1() cout destructing B1 endl; ;/end class B1 class B2 /基類B2 public: B2(int j) cout const

24、ructing B2 j endl; B2() cout destructing B2 endl; ;/end class B2 class B3 /基類B3 public: B3()cout constructing B3 * endl; B3() cout destructing B3 endl; ;/end class B3,class C: public B2, public B1, public B3 /派生新類C /注意基類名的順序 public:/派生類的公有成員 C(int a, int b, int c, int d ):B1(a),memberB2(d),memberB1(

25、c),B2(b) /注意基類名的個數(shù)與順序 /注意成員對象名的個數(shù)與順序 private:/派生類的私有對象成員 B1 memberB1; B2 memberB2; B3 memberB3; ;/end class C void main(void) C obj(1,2,3,4); /main,43,44,例7-5 運行結(jié)果,Constructing B2 2 Constructing B1 1 Constructing B3 * Constructing B1 3 Constructing B2 4 Constructing B3 * Destructing B3 Destructing B

26、2 Destructing B1 Destructing B3 Destructing B1 Destructing B2,45,同名隱藏規(guī)則,當(dāng)派生類與基類中有相同成員時: 若未強行指名,則通過派生類對象使用的是派生類中的同名成員。 如要通過派生類對象訪問基類中被隱藏的同名成員,應(yīng)使用基類名限定。,派生類成員的標識與訪問,46,例7-6 多繼承同名隱藏舉例(1),派生類成員的標識與訪問,class B1 /聲明基類B1 public:/外部接口 int v; void fun()cout v endl; ;/end class B1 class B2 /聲明基類B2 public:/外部接口

27、 int v; void fun()cout v endl; ;/end class B2 class D1: public B1, public B2 /聲明派生類D1 public: int v;/同名數(shù)據(jù)成員 void fun() cout v endl;/同名函數(shù)成員 ;/end class D1,void main(void) D1 d1; d1.v = 1; /對象名.成員名標識 d1.B1:v = 2; /作用域分辨符標識 d1.B2:v = 3; /作用域分辨符標識 d1.fun(); /訪問D1類成員 d1.B1:fun(); /訪問B1基類成員 d1.B2:fun(); /

28、訪問B2基類成員 /main運行結(jié)果: 1 2 3,47,48,二義性問題,在多繼承時,基類與派生類之間,或基類之間出現(xiàn)同名成員時,將出現(xiàn)訪問時的二義性(不確定性)采用虛函數(shù)(參見第8章)或同名隱藏規(guī)則來解決。 當(dāng)派生類從多個基類派生,而這些基類又從同一個基類派生,則在訪問此共同基類中的成員時,將產(chǎn)生二義性采用虛基類來解決。,派生類成員的標識與訪問,49,二義性問題舉例(一),class A public: void f(); ;/class A class B public: void f(); void g() ;/class B,class C: public A, public B p

29、ublic: void g(); void h(); ;/class C 如果定義:C c1; 則 c1.f() 具有二義性 而 c1.g() 無二義性(同名隱藏),派生類成員的標識與訪問,50,二義性的解決方法,解決方法一:用類名來限定c1.A:f() 或 c1.B:f() 解決方法二:同名隱藏在C 中聲明一個同名成員函數(shù)f(),f()再根據(jù)需要調(diào)用 A:f() 或 B:f(),派生類成員的標識與訪問,51,二義性問題舉例(二),class B public: int b; ;/class B class B1: public B private: int b1; ;/class B1 cl

30、ass B2: public B private: int b2; ;/class B2,class C : public B1, public B2 public: int f(); private: int d; ;/class C,派生類成員的標識與訪問,有二義性: C c; c.b c.B:b,無二義性: c.B1:b c.B2:b,52,虛基類,虛基類的引入 用于有共同基類的場合 聲明 以virtual修飾說明基類例:class B1:virtual public B 作用 主要用來解決多繼承時可能發(fā)生的對同一基類繼承多次而產(chǎn)生的二義性問題. 為最遠的派生類提供唯一的基類成員,而不重

31、復(fù)產(chǎn)生多次拷貝 注意: 在第一級繼承時就要將共同基類設(shè)計為虛基類。,53,虛基類舉例,class B public: int b; ; class B1: virtual public B public: int b1; ; class B2: virtual public B public: int b2; ; class C: public B1, public B2 public: float d; ; 下面的訪問是正確的: C c; c.b /等價于c.B1:b或c.B2:b甚至c.B:b,虛 基 類,54,例7-8虛基類舉例,虛 基 類,#include using namespac

32、e std; class Base0 /定義基類Base0 public: int var0; void fun0() cout Member of Base0 endl; ;/end class Base0 class Base1: virtual public Base0 /定義派生類Base1 public:/新增外部接口 int var1; ;/end class Base1 class Base2: virtual public Base0 /定義派生類Base2 public:/新增外部接口 int var2; ;/end class Base2,55,/定義派生類Derived:

33、 class Derived: public Base1, public Base2 public:/新增外部接口 int var; void fun() cout Member of Derived endl; ;/end class Derived void main(void) /主函數(shù) Derived d; /定義Derived類對象d d.var0 = 2; /直接訪問虛基類的數(shù)據(jù)成員 d.fun0(); /直接訪問虛基類的函數(shù)成員 /main,56,57,虛基類及其派生類構(gòu)造函數(shù),建立對象時所指定的類稱為最(遠)派生類。 虛基類的成員是由最派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進

34、行初始化的。 在整個繼承結(jié)構(gòu)中,直接或間接繼承虛基類的所有派生類,都必須在構(gòu)造函數(shù)的成員初始化表中給出對虛基類的構(gòu)造函數(shù)的調(diào)用。如果未列出,則表示調(diào)用該虛基類的默認構(gòu)造函數(shù)。 在建立對象時,只有最派生類的構(gòu)造函數(shù)調(diào)用虛基類的構(gòu)造函數(shù),該派生類的其他基類對虛基類構(gòu)造函數(shù)的調(diào)用被忽略。,虛 基 類,58,有虛基類時的構(gòu)造函數(shù)舉例,虛 基 類,class Base0 /定義基類Base0 public: Base0(int var) : var0(var) int var0; void fun0() cout Member of Base0 endl; ;/end class Base0 class

35、 Base1: virtual public Base0 /定義派生類Base1 public:/新增外部接口 Base1(int var) : Base0(var) int var1; ;/end class Base1 class Base2: virtual public Base0 /定義派生類Base2 public:/新增外部接口 Base2(int var) : Base0(var) int var2; ;/end class Base2,/定義派生類Derived: class Derived: public Base1, public Base2 public: Derive

36、d(int var) : Base0(var), Base1(var), Base2(var) int var; void fun() cout Member of Derived“ endl; ;/end class Derived void main(void) /主函數(shù) Derived d(1); /定義Derived類對象d d.var0 = 2; /直接訪問虛基類的數(shù)據(jù)成員 d.fun0(); /直接訪問虛基類的函數(shù)成員 /main,59,組合與繼承,組合與繼承:通過已有類來構(gòu)造新類的兩種基本方式 組合:B類中存在一個A類型的內(nèi)嵌對象 有一個(has-a)關(guān)系:表明每個B類型對象“有

37、一個” A類型對象 A類型對象與B類型對象是部分與整體關(guān)系 A類型的接口不會直接作為B類型的接口,60,深 度 探 索,“has-a”舉例,class Engine /發(fā)動機類 public: void work(); /發(fā)動機運轉(zhuǎn) ; class Wheel /輪子類 public: void roll(); /輪子轉(zhuǎn)動 ; class Automobile /汽車類 public: void move(); /汽車移動 private: Engine engine; /汽車引擎 Wheel wheels4; /4個車輪 ;,意義 一輛汽車有一個發(fā)動機 一輛汽車有四個輪子 接口 作為整體的汽

38、車不再具備發(fā)動機的運轉(zhuǎn)功能,和輪子的轉(zhuǎn)動功能,但通過將這些功能的整合,具有了自己的功能移動,61,深 度 探 索,公有繼承的意義,公有繼承:A類是B類的公有基類 是一個(is-a)關(guān)系:表明每個B類型對象“是一個” A類型對象 A類型對象與B類型對象是一般與特殊關(guān)系 回顧類的兼容性原則:在需要基類對象的任何地方,都可以使用公有派生類的對象來替代 B類型對象包括A類型的全部接口,62,深 度 探 索,“is-a”舉例,/卡車: class Truck: public Automobile public: void load(); /裝貨 void dump(); /卸貨 private: ; /

39、消防車: class Pumper: public Automobile public: void water(); /噴水 private: ;,意義 卡車是汽車 消防車是汽車 接口 卡車和消防車具有汽車的通用功能(移動) 它們還各自具有自己的功能(卡車:裝貨、卸貨;消防車:噴水),63,深 度 探 索,派生類對象的內(nèi)存布局,派生類對象的內(nèi)存布局 因編譯器而異 內(nèi)存布局應(yīng)使類型兼容規(guī)則便于實現(xiàn) 一個基類指針,無論其指向基類對象,還是派生類對象,通過它來訪問一個基類中定義的數(shù)據(jù)成員,都可以用相同的步驟 不同情況下的內(nèi)存布局 單繼承:基類數(shù)據(jù)在前,派生類新增數(shù)據(jù)在后 多繼承:各基類數(shù)據(jù)按順序在前,派生類新增數(shù)據(jù)在后 虛繼承:需要增加指針,間接訪虛基類數(shù)據(jù),64,深 度 探 索,單繼承情形,class Base ; class Derived: public Base ; Derived *pd = new Derived(); Base *pb = pd;,65,Derived類型指針pd轉(zhuǎn)換為

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論