第10讲类重用与多态性696306382

上传人:yc****d 文档编号:243340503 上传时间:2024-09-21 格式:PPT 页数:84 大小:361KB
返回 下载 相关 举报
第10讲类重用与多态性696306382_第1页
第1页 / 共84页
第10讲类重用与多态性696306382_第2页
第2页 / 共84页
第10讲类重用与多态性696306382_第3页
第3页 / 共84页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,计算机程序设计基础,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第十讲 类的重用与多态性,教材:,C+,语言程序设计,(第,4,版),第,4,章,4.4,,第,78,章,8.3,、,8.4,1,目录,10.1,类的组合,10.2,类的继承与派生,10.3,访问控制,10.4,类型兼容规则,10.5,多态性,10.6,派生类的构造、析构函数,10.7,派生类成员的标识与访问,10.8,小结,2,10.1.1,组合,类中的成员数据是另一个类的对象。,可以在已有抽象的基础上实现更复杂的抽象。,10.1,类的组合,3,类组合的构造函数设计,原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。,声明形式:,类名,:,类名,(,对象成员所需的形参,本类成员形参,),:,对象,1(,参数,),,对象,2(,参数,),,,.,本类初始化,10.1,类的组合, 10.1.1,组合,4,类组合的构造函数调用,构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反),初始化列表中未出现的内嵌对象,用默认构造函数(即无形参的)初始化,系统自动生成的隐含的默认构造函数中,内嵌对象全部用默认构造函数初始化,10.1,类的组合, 10.1.1,组合,5,例10-1(教材例4-4)类的组合,线段(Line)类,/4_4.cpp,#include ,#include ,using namespace std;,class Point /Point,类定义,public:,Point(int xx = 0, int yy = 0) ,x = xx;,y = yy;,Point(Point ,int getX() return x; ,int getY() return y; ,private:,int x, y;,;,Point:Point(Point &p) /,拷贝构造函数的实现,x = p.x;,y = p.y;,cout Calling the copy constructor of Point endl;,10.1,类的组合, 10.1.1,组合,6,/,类的组合,class Line /Line,类的定义,public:/,外部接口,Line(Point xp1, Point xp2);,Line(Line ,double getLen() return len; ,private:/,私有数据成员,Point p1, p2;/Point,类的对象,p1,p2,double len;,;,/,组合类的构造函数,Line:Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) ,cout Calling constructor of Line endl;,double x = static_cast(p1.getX() - p2.getX();,double y = static_cast(p1.getY() - p2.getY();,len = sqrt(x * x + y * y);,Line:Line (Line &l): p1(l.p1), p2(l.p2) /,组合类的拷贝构造函数,cout Calling the copy constructor of Line endl;,len = l.len;,10.1,类的组合, 10.1.1,组合,例10-1(续),7,/,主函数,int main() ,Point myp1(1, 1), myp2(4, 5);/,建立,Point,类的对象,Line line(myp1, myp2);/,建立,Line,类的对象,Line line2(line);/,利用拷贝构造函数建立一个新对象,cout The length of the line is: ;,cout line.getLen() endl;,cout The length of the line2 is: ;,cout line2.getLen() x = x; this-y = y;,void move(float offX, float offY), x += offX; y += offY; ,float getX() const return x; ,float getY() const return y; ,private:/,私有数据成员,float x, y;,;,#endif /_POINT_H,10.3,访问控制, 10.3.1,公有继承,22,例,10-2 (,续,),/Rectangle.h,#ifndef _RECTANGLE_H,#define _RECTANGLE_H,#include Point.h,class Rectangle: public Point /,派生类定义部分,public:/,新增公有函数成员,void initRectangle(float x, float y, float w, float h) ,initPoint(x, y); /,调用基类公有成员函数,this-w = w;,this-h = h;,float getH() const return h; ,float getW() const return w; ,private:/,新增私有数据成员,float w, h;,;,#endif /_RECTANGLE_H,10.3,访问控制, 10.3.1,公有继承,23,例,10-2 (,续,),#include ,#include ,using namespace std;,int main() ,Rectangle rect;/,定义,Rectangle,类的对象,/,设置矩形的数据,rect.initRectangle(2, 3, 20, 10);,rect.move(3,2);/,移动矩形位置,cout The data of rect(x,y,w,h): endl;,/,输出矩形的特征参数,cout rect.getX() , , rect.getY() , , rect.getW() , , rect.getH() x = x; this-y = y;,void move(float offX, float offY), x += offX; y += offY; ,float getX() const return x; ,float getY() const return y; ,private:/,私有数据成员,float x, y;,;,#endif /_POINT_H,10.3,访问控制, 10.3.2,私有继承,26,例,10-3,(续),/Rectangle.h,#ifndef _RECTANGLE_H,#define _RECTANGLE_H,#include Point.h,class Rectangle:,private,Point /,派生类定义部分,public:/,新增公有函数成员,void initRectangle(float x, float y, float w, float h) ,initPoint(x, y),; /,调用基类公有成员函数,this-w = w;,this-h = h;,void move(float offX, float offY) ,Point:move(offX, offY),;,float getX() const ,return Point:getX(),;,float getY() const ,return Point:getY(),;,float getH() const return h; ,float getW() const return w; ,private:/,新增私有数据成员,float w, h;,;,#endif /_RECTANGLE_H,10.3,访问控制, 10.3.2,私有继承,27,例,10-3 (,续,),#include ,#include ,using namespace std;,int main() ,Rectangle,rect,;/,定义,Rectangle,类的对象,rect.initRectangle,(2, 3, 20, 10);/,设置矩形的数据,rect.,move,(3,2);/,移动矩形位置,cout The data of rect(x,y,w,h): endl;,cout rect.,getX,() , /,输出矩形的特征参数, rect.,getY,() , , rect.,getW,() , , rect.,getH,() endl;,return 0;,10.3,访问控制, 10.3.2,私有继承,28,10.3.3,保护继承,(protected),基类的,public,和,protected,成员都以,protected,身份出现在派生类中,但基类的,private,成员,不可直接访问,。,派生类中的成员函数可以直接访问基类中的,public,和,protected,成员,但不能直接访问基类的,private,成员。,通过派生类的对象不能直接访问基类中的任何成员,10.3,访问控制, 10.3.3,保护继承,29,protected,成员的特点与作用,对建立其所在类对象的模块来说,它与,private,成员的性质相同。,对于其派生类来说,它与,public,成员的性质相同。,既实现了数据隐藏,又方便继承,实现代码重用。,10.3,访问控制, 10.3.3,保护继承,30,例:,protected,成员举例,class A ,protected:,int x;,;,int main() ,A a;,a.x = 5; /,错误,10.3,访问控制, 10.3.3,保护继承,31,例,(,续,),class A ,protected:,int x;,;,class B: public A,public:,void function();,;,void B:function() ,x = 5; /,正确,10.3,访问控制, 10.3.3,保护继承,32,10.4,类型兼容规则,一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:,派生类的对象可以隐含转换为基类对象。,派生类的对象可以初始化基类的引用。,派生类的指针可以隐含转换为基类的指针。,通过基类对象名、指针只能使用从基类继承的成员,10.4,类型兼容规则,33,例,10-4,(教材例,7-3,),类型兼容规则举例,#include ,using namespace std;,class Base1 /,基类,Base1,定义,public:,void display() const ,cout Base1:display() endl;,;,class Base2: public Base1 /,公有派生类,Base2,定义,public:,void display() const ,cout Base2:display() endl;,;,class Derived: public Base2 /,公有派生类,Derived,定义,public:,void display() const ,cout Derived:display() display();/,对象指针,-,成员名,int main() /,主函数,Base1 base1;/,声明,Base1,类对象,Base2 base2;/,声明,Base2,类对象,Derived derived;/,声明,Derived,类对象,fun(/,用,Base1,对象的指针调用,fun,函数,fun(/,用,Base2,对象的指针调用,fun,函数,fun( /,用,Derived,对象的指针调用,fun,函数,return 0;,10.4,类型兼容规则,运行结果:,Base1:display(),Base1:display(),Base1:display(),绝对不要重新定义继承而来的非虚函数,35,10.5.1,一般虚函数成员,C+,中引入了虚函数的机制在派生类中可以对基类中的成员函数进行覆盖(重定义)。,虚函数的声明,Virtual,函数类型 函数名(形参表),函数体,10.5,多态性,36,例,10-5,(教材例,8-4,)虚函数成员,#include ,using namespace std;,class Base1 /,基类,Base1,定义,public:,virtual,void,display,() const;/,虚函数,;,void Base1:display() const ,cout Base1:display() endl;,class Base2:public Base1 /,公有派生类,Base2,定义,public:,void,display,() const;/,覆盖基类的虚函数,;,void Base2:display() const ,cout Base2:display() endl;,10.5,多态性, 10.5.1,一般虚函数成员,37,class Derived: public Base2 /,公有派生类,public:,void display() const; /,覆盖基类的虚函数,;,void Derived:display() const ,cout Derived:display() display();/,对象指针,-,成员名,int main() /,主函数,Base1 base1;/,定义,Base1,类对象,Base2 base2;/,定义,Base2,类对象,Derived derived;/,定义,Derived,类对象,fun(/,用,Base1,对象的指针调用,fun,函数,fun(/,用,Base2,对象的指针调用,fun,函数,fun(/,用,Derived,对象的指针调用,fun,函数,return 0;,例,10-5,(续),10.5,多态性, 10.5.1,一般虚函数成员,运行结果:,Base1:display(),Base2:display(),Derived:display(),38,10.5.2,虚析构函数,为什么需要虚析构函数?,可能通过基类指针删除派生类对象;,如果你打算允许其他人通过基类指针调用对象的析构函数(通过,delete,这样做是正常的),就需要让基类的析构函数成为虚函数,否则执行,delete,的结果是不确定的。,10.5,多态性,39,例,10-6,(教材例,8-5,)虚析构函数举例,#include ,using namespace std;,class Base ,public:,Base();,;,Base:Base() ,cout Base destructor endl;,class Derived: public Base,public:,Derived();,Derived();,10.5,多态性, 10.5.2,虚析构函数,private:,int *p;,;,Derived:Derived() ,p = new int(0);,Derived:Derived() ,cout Derived destructor endl;,delete p;,void fun(Base* b) ,delete b;,int main() ,Base *b = new Derived();,fun(b);,return 0;,40,例,10-6,(续),运行时结果:,Base destructor,避免上述错误的有效方法就是将析构函数声明为虚函数,运行结果变为:,Derived destructor,Base destructor,10.5,多态性, 10.5.2,虚析构函数,41,指向,f(),的指针,指向,g(),的指针,Base,的虚表,指向,f(),的指针,指向,g(),的指针,指向,h(),的指针,Derived,的虚表,(Base:f,的代码,),push %ebp,mov %esp,%ebp,(Base:g,的代码,),push %ebp,mov %esp,%ebp,(Derived:f,的代码,),push %ebp,mov %esp,%ebp,(Derived:h,的代码,),push %ebp,mov %esp,%ebp,i,vptr,i,vptr,j,Base,类型对象,Derived,类型对象,class Base ,public:,virtual void f();,virtual void g();,private:,int i;,;,class Derived: public Base ,public:,virtual void f(); /,覆盖,Base:f,virtual void h(); /,新增的虚函数,private:,int j;,;,10.5,多态性,10.5.3,虚函数动态绑定的实现原理,42,10.5.4,纯虚函数,纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本,纯虚函数的声明格式为:,virtual,函数类型 函数名,(,参数表,) = 0;,带有纯虚函数的类称为抽象类:,class,类名,virtual,类型 函数名,(,参数表,),=0,;,/,纯虚函数,.,10.5,多态性,43,10.5.5,抽象类,作用,抽象类为抽象和设计的目的而声明,将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。,对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。,注意,抽象类只能作为基类来使用。,不能声明抽象类的对象。,构造函数不能是虚函数,析构函数可以是虚函数。,10.5,多态性,44,例,10-7,(教材例,8-6,)抽象类举例,/8_6.cpp,#include ,using namespace std;,class Base1 /,基类,Base1,定义,public:,virtual void display() const = 0;/,纯虚函数,;,class Base2: public Base1 /,公有派生类,Base2,定义,public:,void display() const;/,覆盖基类的虚函数,;,void Base2:display() const ,cout Base2:display() endl;,10.5,多态性, 10.5.5,抽象类,45,class Derived: public Base2 /,公有派生类,Derived,定义,public:,void display() const;/,覆盖基类的虚函数,;,void Derived:display() const ,cout Derived:display() display();/,对象指针,-,成员名,int main() /,主函数,Base2 base2;/,定义,Base2,类对象,Derived derived;/,定义,Derived,类对象,fun(/,用,Base2,对象的指针调用,fun,函数,fun(/,用,Derived,对象的指针调用,fun,函数,return 0;,10.5,多态性, 10.5.5,抽象类,例,10-7,(续),运行结果:,Base2:display(),Derived:display(),46,基类与派生类的对应关系,单继承,派生类只从一个基类派生。,多继承,派生类从多个基类派生。,多重派生,由一个基类派生出多个不同的派生类。,多层派生,派生类又作为基类,继续派生新的类。,10.6,派生类的构造和析构函数, 10.6.1,构造函数,47,多继承时派生类的声明,class,派生类名:继承方式,1,基类名,1,,继承方式,2,基类名,2,,,.,成员声明;,注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。,10.6,派生类的构造和析构函数, 10.6.1,构造函数,48,例,10-8,多继承举例,class A ,public:,void setA(int);,void showA() const;,private:,int a;,;,class B ,public:,void setB(int);,void showB() const;,private:,int b;,;,class C : public A, private B ,public:,void setC(int, int, int);,void showC() const;,private const:,int c;,;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,49,例,10-8,(,续,),void A:setA(int x) ,a=x;,void B:setB(int x) ,b=x;,void C:setC(int x, int y, int z) ,/,派生类成员直接访问基类的,/,公有成员,setA(x);,setB(y);,c = z;,/,其他函数实现略,int main() ,C obj;,obj.setA(5);,obj.showA();,obj.setC(6,7,9);,obj.showC();,/ obj.setB(6);,错误,/ obj.showB();,错误,return 0;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,50,继承时的构造函数,基类的构造函数不被继承,派生类中需要声明自己的构造函数。,定义构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。,派生类的构造函数需要给基类的构造函数传递参数,10.6,派生类的构造和析构函数, 10.6.1,构造函数,51,单一继承时的构造函数,派生类名,:,派生类名,(,基类所需的形参,本类成员所需的形参,):,基类名,(,参数表,),本类成员初始化赋值语句;,;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,52,例,10-9,单一继承时的构造函数举例,#include,using namecpace std;,class B ,public:,B();,B(int i);,B();,void print() const;,private:,int b;,;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,53,例,10-9,(,续,),B:B() ,b=0;,cout Bs default constructor called. endl;,B:B(int i) ,b=i;,cout Bs constructor called. endl;,B:B() ,cout Bs destructor called. endl;,void B:print() const ,cout b endl;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,54,例,10-9,(,续,),class C: public B ,public:,C();,C(int i, int j);,C();,void print() const;,private:,int c;,;,C:C() ,c = 0;,cout Cs default constructor called. endl;,C:C(int i,int j): B(i) ,c = j;,cout Cs constructor called. endl;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,55,例,10-9,(,续,),C:C() ,cout Cs destructor called. endl;,void C:print() const ,B:print();,cout c endl;,int main() ,C obj(5, 6);,obj.print();,return 0;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,56,多继承时的构造函数,派生类名,:,派生类名,(,参数表,):,基类名,1(,基类,1,初始化参数表,),基类名,2(,基类,2,初始化参数表,), .,基类名,n(,基类,n,初始化参数表,),本类成员初始化赋值语句;,;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,57,派生类与基类的构造函数,当基类中声明有缺省构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数,也可以不声明,构造派生类的对象时,基类的缺省构造函数将被调用。,当需要执行基类中带形参的构造函数来初始化基类数据时,派生类构造函数应在初始化列表中为基类构造函数提供参数。,10.6,派生类的构造和析构函数, 10.6.1,构造函数,58,多继承且有内嵌对象时的构造函数,派生类名,:,派生类名,(,形参表,):,基类名,1(,参数,),基类名,2(,参数,), .,基类名,n(,参数,),,新增成员对象的初始化,本类成员初始化赋值语句;,;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,59,构造函数的执行顺序,调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。,对成员对象进行初始化,初始化顺序按照它们在类中声明的顺序。,执行派生类的构造函数体中的内容。,10.6,派生类的构造和析构函数, 10.6.1,构造函数,60,例,10-10,(教材例,7-4,),派生类构造函数举例,#include ,using namespace std;,class Base1 /,基类,Base1,,构造函数有参数,public:,Base1(int i) cout Constructing Base1 i endl; ,;,class Base2 /,基类,Base2,,构造函数有参数,public:,Base2(int j) cout Constructing Base2 j endl; ,;,class Base3 /,基类,Base3,,构造函数无参数,public:,Base3() cout Constructing Base3 * endl; ,;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,61,例,10-10 (,续,),class Derived: public Base2, public Base1, public Base3 ,/,派生新类,Derived,,注意基类名的顺序,public:/,派生类的公有成员,Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b), ,/,注意基类名的个数与顺序,,/,注意成员对象名的个数与顺序,private:/,派生类的私有成员对象,Base1 member1;,Base2 member2;,Base3 member3;,;,int main() ,Derived obj(1, 2, 3, 4);,return 0;,10.6,派生类的构造和析构函数, 10.6.1,构造函数,运行结果:,constructing Base2 2,constructing Base1 1,constructing Base3 *,constructing Base1 3,constructing Base2 4,constructing Base3 *,62,10.6.2,拷贝构造函数,若建立派生类对象时没有编写拷贝构造函数,编译器会生成一个隐含的拷贝构造函数,该函数先调用基类的拷贝构造函数,再为派生类新增的成员对象执行拷贝。,若编写派生类的拷贝构造函数,则需要为基类相应的拷贝构造函数传递参数。,例如,:,C:C(const C &c1): B(c1) ,10.6,派生类的构造和析构函数,63,10.6.3,析构函数,析构函数也不被继承,派生类自行声明,声明方法与一般(无继承关系时)类的析构函数相同。,不需要显式地调用基类的析构函数,系统会自动隐式调用。,析构函数的调用次序与构造函数相反。,10.6,派生类的构造和析构函数, 10.6.3,析构函数,64,例,10-11,(教材例,7-5,),派生类析构函数举例,#include ,using namespace std;,class Base1 /,基类,Base1,,构造函数有参数,public:,Base1(int i) cout Constructing Base1 i endl; ,Base1() cout Destructing Base1 endl; ,;,class Base2 /,基类,Base2,,构造函数有参数,public:,Base2(int j) cout Constructing Base2 j endl; ,Base2() cout Destructing Base2 endl; ,;,class Base3 /,基类,Base3,,构造函数无参数,public:,Base3() cout Constructing Base3 * endl; ,Base3() cout Destructing Base3 endl; ,;,10.6,派生类的构造和析构函数, 10.6.3,析构函数,65,例,10-11 (,续,),class Derived: public Base2, public Base1, public Base3 ,/,派生新类,Derived,,注意基类名的顺序,public:/,派生类的公有成员,Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b) ,/,注意基类名的个数与顺序,注意成员对象名的个数与顺序,private:/,派生类的私有成员对象,Base1 member1;,Base2 member2;,Base3 member3;,;,int main() ,Derived obj(1, 2, 3, 4);,return 0;,10.6,派生类的构造和析构函数, 10.6.3,析构函数,66,例,10-11 (,续,),运行结果:,Constructing Base2 2,Constructing Base1 1,Constructing Base3 *,Constructing Base1 3,Constructing Base2 4,Constructing Base3 *,Destructing Base3,Destructing Base2,Destructing Base1,Destructing Base3,Destructing Base1,Destructing Base2,10.6,派生类的构造和析构函数, 10.6.3,析构函数,67,同名隐藏规则,当派生类与基类中有相同成员时:,若未强行指名,则通过派生类对象使用的是派生类中的同名成员。,如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名限定。,10.7,派生类成员的标识与访问, 10.7.1,作用域分辨,68,例,10-12,(教材例,7-6,),多继承同名隐藏举例,#include ,using namespace std;,class Base1 /,定义基类,Base1,public:,int var;,void fun() cout Member of Base1 endl; ,;,class Base2 /,定义基类,Base2,public:,int var;,void fun() cout Member of Base2 endl; ,;,class Derived: public Base1, public Base2 /,定义派生类,Derived,public:,int var;/,同名数据成员,void fun() cout Member of Derived Base2:var = 3;/,作用域分辨符标识,p-Base2:fun();/,访问,Base2,基类成员,return 0;,10.7,派生类成员的标识与访问, 10.7.1,作用域分辨,70,二义性问题,在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性),采用虚函数(参见第,8,章)或同名隐藏规则来解决。,当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性,采用虚基类来解决。,10.7,派生类成员的标识与访问, 10.7.1,作用域分辨,71,二义性问题举例,class A ,public:,void f();,;,class B ,public:,void f();,void g(),;,class C: public A, piblic B ,public:,void g();,void h();,;,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!