C++程序设计基础第12章虚函数与多态性课件_第1页
C++程序设计基础第12章虚函数与多态性课件_第2页
C++程序设计基础第12章虚函数与多态性课件_第3页
C++程序设计基础第12章虚函数与多态性课件_第4页
C++程序设计基础第12章虚函数与多态性课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章虚函数与多态性主讲:李政伟第12章虚函数与多态性主讲:李政伟2第12章虚函数与多态性12.1多态性的概念12.2虚函数的定义12.3抽象类12.4实例研究2第12章虚函数与多态性12.1多态性的概念3多态性是OOP的重要特征之一。多态一词最初来源于希腊语Polumorphos,含义是具有多种形式或形态的情形。多态性:发出同样的消息被不同类型的对象接收时会导致完全不同的行为。多态性:父类型具有“引用由它派生的任何子类型”的能力。多态的实现途径函数重载运算符重载虚函数12.1多态性(polymorphism)的概念静态多态动态多态3多态性是OOP的重要特征之一。12.1多态性(polym4函数重载:在同一作用域内的多个函数采用相同名字,只要使用不同类型、不同数目的参数。作为重载函数:(1)至少在参数个数、参数类型上有所不同。(2)使用缺省函数参数要注意二义性。如:voidprint(inta,intb);voidprint(inta,intb,intc=50);

print(10,100);12.1多态性(polymorphism)的概念4函数重载:在同一作用域内的多个函数采用相同名字,只要使用不512.1多态性(polymorphism)的概念运算符重载:对已有的运算符赋予多重含义。必要性C++中预定义运算符其运算对象只能是标准数据类型,而不适用于用户自定义类型(如类)。实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。512.1多态性(polymorphism)的概念运算符重6分类——系统实现的角度静态多态性:在编译时系统就能决定调用哪个函数,又称编译时的多态性。函数重载、运算符重载动态多态性:在运行过程中才动态确定操作所针对的对象。又称运行时多态。虚函数(virtualfunction)12.1多态性(polymorphism)的概念6分类——系统实现的角度12.1多态性(polymorph7classPoint{public:

Point(doublei,doublej){x=i;y=j;} doubleArea()const{return0.0;}private:doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel); doubleArea()const{returnw*h;}private: doublew,h;};例12.1非虚函数举例7classPoint例12.1非虚函数举例8Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){ w=k;h=l;}voidfun(Point&Pref){ cout<<"Area="<<Pref.Area()<<endl;}voidmain(){ Rectanglerec(3.0,6.0,15.0,20.0); fun(rec);}例12.1非虚函数举例8Rectangle::Rectangle(doublei注意事项派生类对象指针使用时应注意的问题:(1)声明为指向基类对象的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。(2)允许声明为指向基类对象的指针指向它的公有派生类的对象,但不允许将一个声明为指向派生类对象的指针指向基类的对象。(3)声明为指向基类对象的指针,当其指向它的公有派生类的对象时,只能直接访问派生类中从基类继承下来的成员,不能直接访问公有派生类中定义的成员。要想访问其公有派生类中的成员,可将基类指针用显式类型转换方式转换为派生类指针。注意事项派生类对象指针使用时应注意的问题:1012.3虚函数12.3.1虚函数的作用同一类中不能定义名字,参数个数和类型都相同的函数,不能“重复定义”。不同层次中可以出现名字、参数个数和类型都相同而功能不同的函数。系统按照同名覆盖的原则决定调用对象。rc1.area()

//派生类Rectangle的成员函数。rc1.Point::area()

//基类Point的成员函数Pref.area()1012.3虚函数12.3.1虚函数的作用11虚函数的声明形式virtual<函数类型><函数名>(<参数列表>){函数体}成员函数,非static成员函数有继承性,基类中定义了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。作用:通过基类指针或引用调用执行时根据指针指向的对象类型动态决定调用哪个函数。12.3虚函数11虚函数的声明形式12.3虚函数12classA{public:

virtualvoiddisplay(){cout<<“A::display()";}};classB:publicA{public: voiddisplay()//自动成为虚函数{cout<<“B::display()";}};classC:publicB{public: voiddisplay()//自动成为虚函数{cout<<“C::display()"<<endl;}};voidfun(A

*ptr){ptr->display();}voidmain() { Aa1,*p;

Bb1;

Cc1;

p=&a1; fun(p);

p=&b1; fun(p);

p=&c1; fun(p);}12classA{classB:publicAvoi13虚函数的使用方法

(1)基类中用virtual声明其为虚函数(2)要求函数名、返回类型、参数个数和类型全部与基类的虚函数相同,根据需要重新定义函数体。(3)定义一个指向基类对象的指针变量,使它指向同一类族中要调用该函数的对象。(4)通过该指针变量调用此虚函数,调用的是指针变量指向的对象所属类的同名函数。例12.2基类与派生类中有同名函数13虚函数的使用方法例12.2基类与派生类中有同名函数14函数重载可用于普通函数和类的成员函数;虚函数只能用于类的成员函数。函数重载可用于构造函数;虚函数不可以。重载成员函数必须属于同一个类,为横向;虚函数是同一类族中基类和派生类的同原型函数,为纵向。函数重载要求函数名字相同,但参数个数或类型不同;虚函数要求同一类族所有虚函数的名字、参数类型、个数完全相同。函数重载在编译时确定;虚函数在程序运行时确定。函数重载PK虚函数14函数重载可用于普通函数和类的成员函数;虚函数只能用于类的12.2.3虚函数的限制使用虚函数时应注意如下问题:(1)虚函数声明只能出现在类声明的函数原型的声明中,不能出现在函数体实现中,同时基类中只有保护成员或公有成员才能被声明为虚函数。(2)派生类中重新定义虚函数时,关键字virtual可以写也可不写,为避免引起混乱,应写上该关键字。(3)动态联编只能通过成员函数来调用或通过指针、引用来访问虚函数,如果用对象名的形式来访问虚函数,将采用静态联编。(4)构造函数不能声明为虚函数,析构函数可以声明为虚函数12.2.3虚函数的限制使用虚函数时应注意如下问题:例12.3基类中有非虚析构函数时的情况classPoint

//基类Point类{public:Point(){}~Point(){cout<<"executingPointdestructor"<<endl;}};classCircle:publicPoint

//派生类Circle类{public:Circle(){}~Circle(){cout<<"executingCircledestructor"<<endl;}

private:intradius;};intmain(){Point*p=new

Circle;deletep;}executingPointdestructor例12.3基类中有非虚析构函数时的情况classPoin1712.3.4虚析构函数用new运算符建立对象,且定义了指向基类的指针变量。用带指针参数的delete运算符撤销对象时:只执行基类析构函数,而不执行派生类的析构函数。1712.3.4虚析构函数用new运算符建立对象,且定义了18virtual~Point(){cout<<"executingPointdestructor"<<endl;}executingCircledestructorexecutingPointdestructor例12.3基类中有非虚析构函数时的情况基类的析构函数为虚函数时,该基类的所有派生类的析构函数都自动成为虚函数,即使两者的名字不同。推荐:基类析构函数声明为虚函数。18virtual~Point(){cout<<"exec1912.4纯虚函数与抽象类12.4.1纯虚函数基类中成员函数设为虚函数,一般并不是基类本身的要求,而是考虑到派生类的需要。基类Point没有求面积的Area函数,“点”没有面积,基类本身不需要这个函数。直接派生类Circle和间接派生类Rectangle中都需要Area函数,且功能不同。1912.4纯虚函数与抽象类12.4.1纯虚函数2012.4.1纯虚函数virtualfloatarea()const{return0;}

//虚函数virtualfloatarea()const=0;//纯虚函数纯虚函数(purevirtualfunction):在声明虚函数时被“初始化”为0的函数。纯虚函数的声明格式:virtual

函数类型函数名(参数表列)=0;注:①无函数体;②“=0”不表示返回值为0,只用来告知是纯虚函数;③以分号结束。2012.4.1纯虚函数virtualfloatare21只有函数名字而不具备函数的功能,不能被调用。只是通知编译系统:"这里声明一个虚函数,留待派生类中定义"。作用:基类中为其保留了函数名字,以便派生类根据需要对它进行定义。若基类声明了纯虚函数,而派生类没有定义,则该虚函数在派生类中仍然为纯虚函数。12.4.1纯虚函数21只有函数名字而不具备函数的功能,不能被调用。只是通知编译2212.4.2抽象类(abstractclass)定义1:不能用来定义对象而只作为基类的类。定义2:带有纯虚函数的类。一种特殊的类,它为一族类提供统一的操作界面,处于继承层次结构的较上层。作用:通过它多态地使用其中的成员函数。描述了一组子类共同的操作接口,而完整的实现留给了子类。只能作为基类,不能实例化。但可以声明抽象类的指针和引用,指向并访问派生类的对象。若在派生类中对抽象类的所有纯虚函数进行了定义,派生类就成了具体类。若在派生类中没有对所有纯虚函数进行定义,则此派生类仍为抽象类。2212.4.2抽象类(abstractclass)定义23例12.4虚函数和抽象基类的应用例12.4虚函数和抽象基类的应用。对Point为基类的点—圆—圆柱体类的层次结构进行改写,要求使用虚函数和抽象基类。顶层是抽象基类Shape(形状)。Point(点),Circle(圆),Cylinder(圆柱体)都是Shape类的直接派生类和间接派生类。23例12.4虚函数和抽象基类的应用例12.4虚函数和抽24第(1)部分classShape

//抽象基类Shape{public:

virtualfloatarea()const{return0.0;}

virtualfloatvolume()const{return0.0;}

virtualvoidshapeName()const=0;};24第(1)部分classShape//抽象基类Shap25第(2)部分classPoint:publicShape

//Shape的公用派生类{public:Point(float=0,float=0);voidsetPoint(float,float);floatgetX()const{returnx;}floatgetY()const{returny;}

virtualvoidshapeName()const{cout<<"Point:";}

friendostream&operator<<(ostream&,constPoint&);protected:floatx,y;};25第(2)部分classPoint:publicSh26classCircle:publicPoint

//Circle类{public:Circle(floatx=0,floaty=0,floatr=0);voidsetRadius(float);floatgetRadius()const;virtualfloatarea()const;

virtualvoidshapeName()const{cout<<"Circle:";}

friendostream&operator<<(ostream&,constCircle&);protected:

floatradius;};第(3)部分26classCircle:publicPoint/27Circle::Circle(floata,floatb,floatr):Point(a,b),radius(r){}voidCircle::setRadius(floatr):radius(r){}floatCircle::getRadius()const{returnradius;}floatCircle::area()const{return3.14159*radius*radius;}ostream&operator<<(ostream&output,constCircle&c){output<<"["<<c.x<<","<<c.y<<"],r="<<c.radius;returnoutput;}第(3)部分27Circle::Circle(floata,float28第(4)部分classCylinder:publicCircle

//Cylinder类{public:Cylinder(floatx=0,floaty=0,floatr=0,floath=0);voidsetHeight(float);virtualfloatarea()const;virtualfloatvolume()const;

virtualvoidshapeName()const{cout<<"Cylinder:";}

friendostream&operator<<(ostream&,constCylinder&);protected:floatheight;};28第(4)部分classCylinder:public29Cylinder::Cylinder(floata,floatb,floatr,floath):Circle(a,b,r),height(h){}floatCylinder::area()const{return2*Circle::area()+2*3.14159*radius*height;}floatCylinder::volume()const{returnCircle::area()*height;}ostream&operator<<(ostream&output,constCylinder&cy){output<<"["<<cy.x<<","<<cy.y<<"],r="<<cy.radius<<",h="<<cy.height;returnoutput;}第(4)部分29Cylinder::Cylinder(floata,f30intmain(){Pointpoint(3.2,4.5);Circlecircle(2.4,1.2,5.6);Cylindercylinder(3.5,6.4,5.2,10.5);

point.shapeName();

cout<<point<<endl;circle.shapeName();

cout<<circle<<endl;cylinder.shapeName();

cout<<cylinder<<endl<<endl;

Shape*pt;//定义基类指针

pt=&point;//指针指向Point类对象

pt->shapeName();cout<<"x="<<point.getX()<<",y="<<point.getY()<<"\\narea="<<pt->area()<<"\\nvolume="<<pt->volume()<<"\\n\\n";第(5)部分30intmain()第(5)部分31pt=&circle;//指针指向Circle类对象pt->shapeName();//动态关联

cout<<"x="<<circle.getX()<<",y="<<circle.getY()<<"\\narea="<<pt->area()<<"\\nvolume="<<pt->volume()<<"\\n\\n";pt=&cylinder;//指针指向Cylinder类对象pt->shapeName();//动态关联cout<<"x="<<cylinder.getX()<<",y="<<cylinder.getY()<<"\\narea="<<pt->area()<<"\\nvolume="<<pt->volume()<<"\\n\\n";return0;}第(5)部分31pt=&circle;//指针指向Circle类对象32ThankYouTheEndofCh.12.

32ThankYouTheEndofCh.12.第12章虚函数与多态性主讲:李政伟第12章虚函数与多态性主讲:李政伟34第12章虚函数与多态性12.1多态性的概念12.2虚函数的定义12.3抽象类12.4实例研究2第12章虚函数与多态性12.1多态性的概念35多态性是OOP的重要特征之一。多态一词最初来源于希腊语Polumorphos,含义是具有多种形式或形态的情形。多态性:发出同样的消息被不同类型的对象接收时会导致完全不同的行为。多态性:父类型具有“引用由它派生的任何子类型”的能力。多态的实现途径函数重载运算符重载虚函数12.1多态性(polymorphism)的概念静态多态动态多态3多态性是OOP的重要特征之一。12.1多态性(polym36函数重载:在同一作用域内的多个函数采用相同名字,只要使用不同类型、不同数目的参数。作为重载函数:(1)至少在参数个数、参数类型上有所不同。(2)使用缺省函数参数要注意二义性。如:voidprint(inta,intb);voidprint(inta,intb,intc=50);

print(10,100);12.1多态性(polymorphism)的概念4函数重载:在同一作用域内的多个函数采用相同名字,只要使用不3712.1多态性(polymorphism)的概念运算符重载:对已有的运算符赋予多重含义。必要性C++中预定义运算符其运算对象只能是标准数据类型,而不适用于用户自定义类型(如类)。实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。512.1多态性(polymorphism)的概念运算符重38分类——系统实现的角度静态多态性:在编译时系统就能决定调用哪个函数,又称编译时的多态性。函数重载、运算符重载动态多态性:在运行过程中才动态确定操作所针对的对象。又称运行时多态。虚函数(virtualfunction)12.1多态性(polymorphism)的概念6分类——系统实现的角度12.1多态性(polymorph39classPoint{public:

Point(doublei,doublej){x=i;y=j;} doubleArea()const{return0.0;}private:doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel); doubleArea()const{returnw*h;}private: doublew,h;};例12.1非虚函数举例7classPoint例12.1非虚函数举例40Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){ w=k;h=l;}voidfun(Point&Pref){ cout<<"Area="<<Pref.Area()<<endl;}voidmain(){ Rectanglerec(3.0,6.0,15.0,20.0); fun(rec);}例12.1非虚函数举例8Rectangle::Rectangle(doublei注意事项派生类对象指针使用时应注意的问题:(1)声明为指向基类对象的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。(2)允许声明为指向基类对象的指针指向它的公有派生类的对象,但不允许将一个声明为指向派生类对象的指针指向基类的对象。(3)声明为指向基类对象的指针,当其指向它的公有派生类的对象时,只能直接访问派生类中从基类继承下来的成员,不能直接访问公有派生类中定义的成员。要想访问其公有派生类中的成员,可将基类指针用显式类型转换方式转换为派生类指针。注意事项派生类对象指针使用时应注意的问题:4212.3虚函数12.3.1虚函数的作用同一类中不能定义名字,参数个数和类型都相同的函数,不能“重复定义”。不同层次中可以出现名字、参数个数和类型都相同而功能不同的函数。系统按照同名覆盖的原则决定调用对象。rc1.area()

//派生类Rectangle的成员函数。rc1.Point::area()

//基类Point的成员函数Pref.area()1012.3虚函数12.3.1虚函数的作用43虚函数的声明形式virtual<函数类型><函数名>(<参数列表>){函数体}成员函数,非static成员函数有继承性,基类中定义了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。作用:通过基类指针或引用调用执行时根据指针指向的对象类型动态决定调用哪个函数。12.3虚函数11虚函数的声明形式12.3虚函数44classA{public:

virtualvoiddisplay(){cout<<“A::display()";}};classB:publicA{public: voiddisplay()//自动成为虚函数{cout<<“B::display()";}};classC:publicB{public: voiddisplay()//自动成为虚函数{cout<<“C::display()"<<endl;}};voidfun(A

*ptr){ptr->display();}voidmain() { Aa1,*p;

Bb1;

Cc1;

p=&a1; fun(p);

p=&b1; fun(p);

p=&c1; fun(p);}12classA{classB:publicAvoi45虚函数的使用方法

(1)基类中用virtual声明其为虚函数(2)要求函数名、返回类型、参数个数和类型全部与基类的虚函数相同,根据需要重新定义函数体。(3)定义一个指向基类对象的指针变量,使它指向同一类族中要调用该函数的对象。(4)通过该指针变量调用此虚函数,调用的是指针变量指向的对象所属类的同名函数。例12.2基类与派生类中有同名函数13虚函数的使用方法例12.2基类与派生类中有同名函数46函数重载可用于普通函数和类的成员函数;虚函数只能用于类的成员函数。函数重载可用于构造函数;虚函数不可以。重载成员函数必须属于同一个类,为横向;虚函数是同一类族中基类和派生类的同原型函数,为纵向。函数重载要求函数名字相同,但参数个数或类型不同;虚函数要求同一类族所有虚函数的名字、参数类型、个数完全相同。函数重载在编译时确定;虚函数在程序运行时确定。函数重载PK虚函数14函数重载可用于普通函数和类的成员函数;虚函数只能用于类的12.2.3虚函数的限制使用虚函数时应注意如下问题:(1)虚函数声明只能出现在类声明的函数原型的声明中,不能出现在函数体实现中,同时基类中只有保护成员或公有成员才能被声明为虚函数。(2)派生类中重新定义虚函数时,关键字virtual可以写也可不写,为避免引起混乱,应写上该关键字。(3)动态联编只能通过成员函数来调用或通过指针、引用来访问虚函数,如果用对象名的形式来访问虚函数,将采用静态联编。(4)构造函数不能声明为虚函数,析构函数可以声明为虚函数12.2.3虚函数的限制使用虚函数时应注意如下问题:例12.3基类中有非虚析构函数时的情况classPoint

//基类Point类{public:Point(){}~Point(){cout<<"executingPointdestructor"<<endl;}};classCircle:publicPoint

//派生类Circle类{public:Circle(){}~Circle(){cout<<"executingCircledestructor"<<endl;}

private:intradius;};intmain(){Point*p=new

Circle;deletep;}executingPointdestructor例12.3基类中有非虚析构函数时的情况classPoin4912.3.4虚析构函数用new运算符建立对象,且定义了指向基类的指针变量。用带指针参数的delete运算符撤销对象时:只执行基类析构函数,而不执行派生类的析构函数。1712.3.4虚析构函数用new运算符建立对象,且定义了50virtual~Point(){cout<<"executingPointdestructor"<<endl;}executingCircledestructorexecutingPointdestructor例12.3基类中有非虚析构函数时的情况基类的析构函数为虚函数时,该基类的所有派生类的析构函数都自动成为虚函数,即使两者的名字不同。推荐:基类析构函数声明为虚函数。18virtual~Point(){cout<<"exec5112.4纯虚函数与抽象类12.4.1纯虚函数基类中成员函数设为虚函数,一般并不是基类本身的要求,而是考虑到派生类的需要。基类Point没有求面积的Area函数,“点”没有面积,基类本身不需要这个函数。直接派生类Circle和间接派生类Rectangle中都需要Area函数,且功能不同。1912.4纯虚函数与抽象类12.4.1纯虚函数5212.4.1纯虚函数virtualfloatarea()const{return0;}

//虚函数virtualfloatarea()const=0;//纯虚函数纯虚函数(purevirtualfunction):在声明虚函数时被“初始化”为0的函数。纯虚函数的声明格式:virtual

函数类型函数名(参数表列)=0;注:①无函数体;②“=0”不表示返回值为0,只用来告知是纯虚函数;③以分号结束。2012.4.1纯虚函数virtualfloatare53只有函数名字而不具备函数的功能,不能被调用。只是通知编译系统:"这里声明一个虚函数,留待派生类中定义"。作用:基类中为其保留了函数名字,以便派生类根据需要对它进行定义。若基类声明了纯虚函数,而派生类没有定义,则该虚函数在派生类中仍然为纯虚函数。12.4.1纯虚函数21只有函数名字而不具备函数的功能,不能被调用。只是通知编译5412.4.2抽象类(abstractclass)定义1:不能用来定义对象而只作为基类的类。定义2:带有纯虚函数的类。一种特殊的类,它为一族类提供统一的操作界面,处于继承层次结构的较上层。作用:通过它多态地使用其中的成员函数。描述了一组子类共同的操作接口,而完整的实现留给了子类。只能作为基类,不能实例化。但可以声明抽象类的指针和引用,指向并访问派生类的对象。若在派生类中对抽象类的所有纯虚函数进行了定义,派生类就成了具体类。若在派生类中没有对所有纯虚函数进行定义,则此派生类仍为抽象类。2212.4.2抽象类(abstractclass)定义55例12.4虚函数和抽象基类的应用例12.4虚函数和抽象基类的应用。对Point为基类的点—圆—圆柱体类的层次结构进行改写,要求使用虚函数和抽象基类。顶层是抽象基类Shape(形状)。Point(点),Circle(圆),Cylinder(圆柱体)都是Shape类的直接派生类和间接派生类。23例12.4虚函数和抽象基类的应用例12.4虚函数和抽56第(1)部分classShape

//抽象基类Shape{public:

virtualfloatarea()const{return0.0;}

virtualfloatvolume()const{return0.0;}

virtualvoidshapeName()const=0;};24第(1)部分classShape//抽象基类Shap57第(2)部分classPoint:publicShape

//Shape的公用派生类{public:Point(float=0,float=0);voidsetPoint(float,float);floatgetX()const{returnx;}floatgetY()const{returny;}

virtualvoidshapeName()const{cout<<"Point:";}

friendostream&operator<<(ostream&,constPoint&);protected:floatx,y;};25第(2)部分classPoint:publicSh58classCircle:publicPoint

//Circle类{public:Circle(floatx=0,floaty=0,floatr=0);voidsetRadius(float);floatgetRadius()const;virtualfloatarea()const;

virtualvoidshapeName()const{cout<<"Circle:";}

friendostream&operator<<(ostream&,constCircle&);protected:

floatradius;};第(3)部分26classCircle:publicPoint/59Circle::Circle(floata,floatb,floatr):Point(a,b),radius(r){}voidCircle::setRadius(floatr):radius(r){}floatCircle::getRadius()const{returnradius;}floatCircle::area()const{return3.14159*radius*radius;}ostream&operator<<(ostream&output,constCircle&c){output<<"["<<c.x<<","<<c.y<<"],r="<<c.radius;returnoutput;}第(3)部分27Circle::Circle(floata,float60第(4)部分classCylinder:publicCircle

//Cylinder类{public:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论