




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 继承与派生 8-1. 教学目的与要求1理解继承的概念;2掌握继承的实现方法;3继承中常见问题的处理方法。 8-2. 主要内容及重点:类是C+中进行数据封装的逻辑单位。继承是面向对象程序设计的一个重要特征之一,它允许在既有类的基础上创建新的类,新类可以从一个或多个既有类中继承操作和数据,而且可以重新定义或加进新的数据和操作,从而形成类的层次或等级。既有类称为基类或父类,在它基础上建立的新类称为派生类、导出类或子类。本章的重点是派生类的定义和使用、创建派生类对象时构造函数的调用顺序、多重继承中的冲突及其消除方法以及作用域运算符的几种使用方法等。本章的难点是基类的初始化、多重继承中的冲突以及虚基类等。8-3. 第8章 继承-课件 3-4. 8-4. 第8章 继承-复习总结 继承是面向对象程序设计方法的基本特性之一,继承可以提高软件的重要性。 本章主要介绍了C+中的继承性的实现方法以及在继承性常见问题的处理方法。包括基类的初始化、访问类型的调整、冲突及其消除方法、成员覆盖、赋值兼容性以及虚基类等。 类的派生包括三种类型:私有派生、保护派生、公有派生。利用构造函数的初始化成员列表,可以在派生类中对基类成员进行初始化。在继承层次关系中要避免冲突的产生,通常是采用指定作用域和定义虚基类这两种方法来解决问题。8-5. 第8章 继承-练习 8-5-1.思考题:1).派生类有几种方式,每种方式中派生类对基类成员的继承如何? 2). 在创建派生类对象时,构造函数的执行次序是怎样的?析构函数的执行次序是怎样的?3). 派生类对象如何对基类中的成员进行初始化?4). 在多重继承中,在什么情况下会产生冲突?如何消除冲突?5). 列举我们已学习的作用域运算符“:”的所有用途。6). 属于不同类的对象在什么情况下可以互相赋值?7).什么叫虚基类?为什么要引进虚基类?8-5-2.练习题: 课后练习题见练习单元。第8章 继承与派生类是C+中进行数据封装的逻辑单位。继承是面向对象程序设计的一个重要特征之一,它允许在既有类的基础上创建新的类,新类可以从一个或多个既有类中继承操作和数据,而且可以重新定义或加进新的数据和操作,从而形成类的层次或等级。既有类称为基类或父类,在它基础上建立的新类称为派生类、导出类或子类。81 继承与派生的基本概念交通工具汽车小汽车 卡车 游行车 工具车 轿车 面包车 811单继承和多继承:单继承:一个类继承一个一般类特性的继承称为单继承。多继承:一个类可以继承多个一般类的特性,然后再在继承来的这些一般类的基础上增加自己的特殊性,这种继承方式称为多继承。 如:一个助教博士,他既是一个学生,又是一个老师,如果从学生类和老师类两个一般类继承特性,则助教博士类可以获得这两个类的特性,因而能进一步增强开发效率。baseClass derived A derived B 单继承 baseClass A derived C baseClass B 多继承 单继承是所有面向对象程序设计语言都具有的功能,但并不是所有的语言都支持多继承,这是由多继承实现的复杂性决定的。C+语言支持多继承。812基类和派生类:在定义类B时,如果它使用了一个已定义的类A的部分或全部成员,则称类B继承了A,或由类A派生出类B。并称类A为基类或父类,类B为派生类或子类。 一个派生类又可以作为另一个类的基类,这样一个基类可以直接或间接派生出若干个派生类,构成树状的继承关系。 但是注意:继承关系不可循环。如:A继承B,B继承,C又继承A,这是非法的。 例类Y继承类X的特性,类Z又继承类Y的特性,从而间接继承来类X的特性。因而类X是类Y的直接基类,是类Z的间接基类,类Y是类X的直接派生类,类Z是类X的间接派生类。类X、Y、Z形成了一个类层次。如前图. 813 两个类之间要具有继承关系,它们通常满足:1)有共同的属性或操作。2)有细微的差别。8 2 派生类说明及其构造函数和析构函数821 派生类的说明从一个基类派生出子类的一般格式为;class : /类体,派生类新增的数据成员和成员函数 ;其中:1) class 是类定义的关键字,用于告诉编译器下面定义的是一个类。2)派生类名是新定义的类名。3)访问属性是访问说明符,可以是private、public、protected之一。此项的默认值为private,派生类名和访问属性之间用冒号隔开。派生类的访问控制由访问属性来确定,它按下述方式来继承基类的访问属性。公有派生 如果访问属性是为public,则基类的public成员是派生类的public成员;基类的protected成员是派生类的protected成员;基类的private成员是派生类的private成员;即基类的private成员对派生类仍保持private属性。 显然,派生类中通过公有派生得到的成员还可以被它的子类继承。私有派生如果访问属性为private,则基类的public和protected成员都是派生类的private成员;这些私有成员能够被派生类的成员函数直接访问;但在派生类之外不可以被直接访问。但基类的private成员对派生类仍然保持private属性,即不能被派生类成员函数访问。总之当访问属性为private时,派生类的对象不能访问基类中以任何方式定义的成员函数。 显然通过私有派生得到的派生类再派生子类时,其继承得到的基类成员不能被它的子类所继承。保护派生如果访问属性为protected,则基类的public和protected成员均是派生类的protected成员;基类的private成员对派生类仍保持private属性。具体来说,基类中声明为protected的数据只能被基类的成员函数或其派生类的成员函数访问;不能被派生类以外的成员函数访问。对保护派生,基类中的公有成员和保护成员在派生类中均变为保护成员,它们仍然可被它的子类所继承。4)值得注意的是,C+规定派生类只能访问基类中的公有成员和保护成员,而不能访问类中的私有成员。即无论哪种派生方式,基类中的私有成员既不允许外部函数访问,也不允许派生类中的成员函数访问,但是可以通过基类提供的公有成员函数访问。 5)公有派生与私有派生的不同点在于基类中的公有成员在派生类中的访问属性。 公有派生时,基类中的所有公有成员在派生类中也都是公有的。 私有派生时,基类中的所有公有成员只能成为派生类中的私有成员。6)基类名可以有一个,也可以有多个。如果只有一个基类,则这中继承方式叫做简单继承,也叫单继承;如果基类名有多个,则这种继承方式称为多重继承。各个基类名之间用逗号隔开。7) 在派生类中声明的名字支配基类中声明的同名的名字,即如果在派生类的成员函数中直接使用该名字的话,则表示使用派生类中声明的名字。8)在C+中下列成员不能继承: 构造函数和析构函数、友元关系、重载的new和delete运算符。822 多重继承 由多个基类派生出一个子类的一般格式为: class :, - - - - /类体,派生类新增的数据成员和成员函数 ;冒号后面的部分称基类表,各基类之间用逗号分隔,派生方式规定了派生类从基类中按什么方式继承,缺省的派生方式是private。任一基类在派生类中只能被继承一次。例: class z :public x ,y /类z公有继承了类x ,私有继承了类y /. ; class z :: x , public y /类z私有继承了类x ,公有继承了类y /. ; class z::public x ,public y /类z公有继承了类x和类y /. ;823 派生类的构造函数和析构函数即基类的初始化由于派生类继承了基类的一些成员,在创建派生类对象时,对派生类中的数据成员和基类中的数据成员都必须进行初始化,从基类中继承的数据成员可以直接使用基类的构造函数来完成初始化,而新增加的数据成员的初始化要由自己的构造函数来完成。在撤消派生类对象时,也要通过基类的析构函数对派生类中继承得到的数据处理。1C+规定,在创建派生类对象时,首先调用基类构造函数,然后再调用派生类构造函数。当撤消派生类对象时,析构函数的调用次序与构造函数的调用次序相反。2初始化基类成员通常通过派生类的构造函数实现,一般格式为:():(),- ,()- - - 派生类的构造函数 其中: 1)是派生类构造函数的形参表,它可以由任意类型的变量组成。 2)冒号后列举的部分为初始化成员列表,在初始化成员列表中,一个基类名只能出现一次。 3)当初始化成员列表中某一个基类的构造函数的实参表为空时,可以将该构造函数从初始化列表中删除。 4)、- - - 、分别为调用相应基类构造函数的实参表,其必须与相应构造函数的形参表一致。实参表中的参数可以为任意合法的表达式,该表达式中可以包含中的参数。 5)如果基类中没有默认参数值的构造函数,则必须在派生类的构造函数中通过上述方式向相应的基类的构造函数传递参数。6)构造函数的调用顺序只与派生类继承的基类的顺序有关,而与初始化成员列表中构造函数顺序无关,与派生类中参数的顺序也无关。7) 如果基类A的派生类为B,B又派生了C,则在对B进行初始化之前,必须对它的基类A进行初始化,通常是通过B的构造函数实现。但是不能通过C的构造函数实现。即一个类的构造函数只能对它的直接基类的构造函数传递实参。对于更多层继承关系,都可按这种方式递归进行。8 )如果派生类中包含对象成员,则创建派生类对象时,C+规定构造函数的调用次序为: 基类的构造函数、对象成员的构造函数、派生类的构造函数。 如果,此时基类中有对象成员,调用基类的构造函数之前还要先调用基类对象成员的构造函数,调用次序与前述类同。 在初始化成员列表中,对象成员采用的是对象名,而对基类的初始化使用的是基类的类名,即基类的构造函数名。调用顺序如下图所示:基类的基类的构造函数基类对象成员的构造函数基类的构造函数派生类对象的构造函数派生类的构造函数 824 总结派生方式(基类的被继承方式) 在基类中的存取权限 在派生类中的存取权限 =public public publicpublic potected protectedpublic private (inaccessible)potected public potectedpotected potected protectedpotected private (inaccessible)private public privateprivate potected privateprivate private (inaccessible) =派生类中可出现四种成员: 1) 不可访问的成员 - 基类的private私有成员被继承过来后,这些成员在派生类中是不可访问的。 2) 私有成员 - 包括在派生类中新增加的private私有成员以及从基类私有继承过来的某些成员。这些成员在派生类中是可以访问的。 3) 保护成员 - 包括在派生类中新增加的potected保护成员以及从基类继承过来的某些成员。这些成员在派生类中是可以访问的。 4) 公有成员 - 包括在派生类中新增加的public公有成员以及从基类公有继承过来的基类的public成员。这些成员不仅在派生类中可以访问,而且在建立派生类对象的模块中,也可以通过对象来访问它们。825 例题(821 派生类的说明)例题1公有派生 如果访问属性是为public,则基类的public成员是派生类的public成员;基类的protected成员是派生类的protected成员;基类的private成员是派生类的private成员;即基类的private成员对派生类仍保持private属性。 显然,派生类中通过公有派生得到的成员还可以被它的子类继承。例1:公有派生中各成员的访问权限# include class CBase int x ;protected ; int y ;public: int z ; CBase (int a , int b , int c) x=a ;y=b; z=c;int Getx (void ) return x ;int Gety (void ) return y ;void ShowBase (void) cout”x=”x” ty=”y” t z=”zendl ;class CDerived :public CBase int Length ,Width ;public :CDerived ( int a , int b ,int c ,int d , int e) :CBase(a,b,c) /A 表示派生类的构造函数调用/基类的构造函数,从而对继承得到的基类的成员进行初始化。见11.2节。 Lengh=d ; Width=e ;void Show (void ) cout”Length=”Length”tWidth=”Widthendl ;cout”x=”Getx( )” t y=”y”t z=”zendl ; /B,x是私有的,不能被继承。int Sum (void) return Gex ( )+y+z+Length+Width ; ;void main ( void ) CDerived d1 (1 ,2,3,4,5) ;d1.ShowBase( ) ; /E,公有成员函数,可以被继承为公有。d1.show ( ) ;cout”sum=”d1.Sum()n” ;cout”y=”d1.Gety( )n ; /C ,y是保护成员,不能被外部访问。cout”z=”d1.zn ; /D,z是公有成员,可以直接访问。执行结果:x=1 y=2 z=3Length=4Width=5 x=1 y=2 z=3Sum=15 y=2 z=32私有派生如果访问属性为private,则基类的public和protected成员都是派生类的private成员;这些私有成员能够被派生类的成员函数直接访问;但在派生类之外不可以被直接访问。但基类的private成员对派生类仍然保持private属性,即不能被派生类成员函数访问。总之当访问属性为private时,派生类的对象不能访问基类中以任何方式定义的成员函数。 显然通过私有派生得到的派生类再派生子类时,其继承得到的基类成员不能被它的子类所继承。例2: 私有派生示例# include class CBase protected : int a ;public : int b ; void Set (int x ,int y)a=x ; b=y ;void Show ( void )coutatbendl ; ;class CDerived :private CBase public: void SetD(int x , int y) Set (x , y) ;void ShowD(void)coutatbendl ; ;void main ( ) CBase b1 ;CDerived d1 ;b1.Set (1 ,2) ;b1.Show( ) ;d1.SetD(10 ,100 ) ; /若d1.set(10 , 100) 则错误,因为set()被私有继承,不能被访问d1.ShowD( ) ; / d1.Show ( ) 则错误,同上执行结果:12 10100假如,还有一个类CCD由派生类CDerived派生出来,定义如下:class CDD :public Cderived- /类体则CDD的类体中的成员不能访问CDerived从基类CBase私有继承来的成员,因为这些成员是类CDerived的私有成员,他们不能被类CDD所继承。当然对类CDerived中的保护成员和公有成员在类CDD中仍然可以被访问。3保护派生如果访问属性为protected,则基类的public和protected成员均是派生类的protected成员;基类的private成员对派生类仍保持private属性。具体来说,基类中声明为protected的数据只能被基类的成员函数或其派生类的成员函数访问;不能被派生类以外的成员函数访问。 对保护派生,基类中的公有成员和保护成员在派生类中均变为保护成员,它们仍然可被它的子类所继承。例3 # include class base protected : int a ,b ; public: void setab (int n ,int m) a=n ; b=m; ; class derive :public base int c ; public: void setc (int n) c= n; void showabc() couta b cendl; /允许派生类成员函数访问保护成员a和b ; main() derive obj ; obj.setab(2,4); obj.setc(3); obj.showabc(); return 0 ; 执行结果:2 4 3Press any key to continue例4 私有继承方式的保护成员 # include class base protected: int a ; public: void seta(int sa) a=sa ; class derive 1:private base protected : int b ; public: void setb(int sb) b=sb ; ; classs derive2:public derive1 int c ; public: void setc(int sc) c=sc; void show() couta=aendl; / 非法 coutb=bendl ; /合法 coutc=cendl ; /合法 ; void main() base op1 ; op1.seta(1) ; derive1 op2 ; op2.setb(2 ) ; derive2 op3 ; op3.setc(3 ) ; op3.show ( ) (823 多重继承及派生类的构造函数和析构函数) 例 题例5 派生类中的构造函数和析构函数的调用顺序# includeclass CBase1 int x ;public:CBase1(int a)x=a ;cout”调用了基类1的构造函数!n” ;CBase1 ( void ) cout”调用了基类1的析构函数!n” ;class CBase2 int y ;public :CBase2 (int a)y=a :cout”调用了基类2的构造函数!n” ;CBase2 ( void ) cout”调用了基类2的析构函数!n” ;class CDerived :public CBase1 , public CBase2 /A 此处基类顺序影响构造函数的调用顺序。 int z ;public:CDerived ( int a , int b ,int c):CBase1(a) ,CBase2(b) /B初始化基类成员 z=c ; cout”调用了派生类的构造函数!n” ; CDerived(void) cout”调用了派生类的析造函数!n” ; ;void main ( void )CDerived d (2, 4 , 6) ;执行结果:调用了基类1的构造函数!调用了基类2的构造函数!调用了派生类的构造函数!调用了派生类的析造函数!调用了基类2的析构函数!调用了基类1的析构函数!7)如果派生类中包含对象成员,则创建派生类对象时,C+规定构造函数的调用次序为: 基类的构造函数、对象成员的构造函数、派生类的构造函数。 如果,此时基类中有对象成员,调用基类的构造函数之前还要先调用基类对象成员的构造函数,调用次序与前述类同。 在初始化成员列表中,对象成员采用的是对象名,而对基类的初始化使用的是基类的类名,即基类的构造函数名。调用顺序如下图所示:基类的基类的构造函数基类对象成员的构造函数基类的构造函数派生类对象的构造函数派生类的构造函数 例6 派生类中包含对象成员,将前例中的派生类的定义作如下的修改:# includeclass CBase1 int x ;public:CBase1(int a)x=a ;cout”调用了基类1的构造函数!n” ;CBase1 ( void ) cout”调用了基类1的析构函数!n” ;class CBase2 int y ;public :CBase2 (int a)y=a :cout”调用了基类2的构造函数!n” ;CBase2 ( void ) cout”调用了基类2的析构函数!n” ;class CDerived :public CBase1 , public CBase2 int z ; CBase 1 b1 ,b2 ;public:CDerived ( int a , int b , int c ) :CBase1(a) ,CBase2(b) ,b1(20) ,b2(a*b) z=c ; cout”调用了派生类的构造函数! n “ ;CDerived (void ) cout” 调用了派生类的析构函数! n “ ;void main ( void )CDerived d (2, 4 , 6) ;如果其它内容不变,则程序输出:调用了基类1的构造函数!调用了基类2的构造函数!调用了基类1的构造函数!调用了基类1的构造函数!调用了派生类的构造函数!调用了派生类的析造函数!调用了基类1的析构函数!调用了基类1的析构函数!调用了基类2的析构函数!调用了基类1的析构函数!8) 如果基类A的派生类为B,B又派生了C,则在对B进行初始化之前,必须对它的基类A进行初始化,通常是通过B的构造函数实现。但是不能通过C的构造函数实现。即一个类的构造函数只能对它的直接基类的构造函数传递实参。对于更多层继承关系,都可按这种方式递归进行。例7多层继承的基类成员的初始化# includeclass Aprotected: int x ;public:A(int a) x=a ;cout”调用了类A的构造函数n” ;class B :public A protected :int y ;public: B ( int a ,int b) :A(a) y=b ;cout”调用了类B的构造函数n” ;class c :public B protected: int z ;public: C ( int a ,int b, int c) :B(a,b) z=c ;cout”调用了类C的构造函数n” ;void main ( )A a(1) ;B b (10 ,20) ;C c(100 ,200,300) ; 执行结果:调用了类A的构造函数调用了类A的构造函数调用了类B的构造函数调用了类A的构造函数”调用了类B的构造函数调用了类C的构造函数例8:求圆柱的体积#define PI 3.1415926# include class CCircle float r ;public :CCircle ( float R) r = R ;float Getr ( void ) return r ;class Crectangle float l , w ; /矩形的长和宽public :Crectangle ( float L) l=L ;float Getl ( void ) return l ;class CColumn :public CCircle , public Crectangle double v ; /圆柱体的体积public:CColumn (float L ,float w) :CCircle(W/2),Crectangle(L) void Volumn(void)v=PI*Getr()*Getr()*Get1() ;void ShowVolumn(void )cout”Volumn=”vn ;void main (void)CColumn col (7.5,4) ;col.Volumn( ) ;col.ShowVolumn();执行结果:Volumn=94.2478例9 (program 8-3 p260)CA CB CC 类之间的继承关系 CD #includeclass CA int a ;public: CA(int n)a=n; coutCA:a=aendl; ; CA()coutCAobj is destructingendl;class CB int b;public: CB(int n) b=n; coutCB:b=bendl; ; CB()coutCBobj is destructingendl;class CC: public CA int c;public: CC(int n1,int n2):CA(n2) c=n1; coutCC:c=cendl; CC()coutCCobj is destructingendl;class CD:public CB,public CC int d;public:CD(int n1,int n2,int n3,int n4):CC(n3,n4),CB(n2) d=n1; coutCD:d=dendl; CD()coutCDobj is destructingendl;void main(void) CD CDobj(2,4,6,8); 运行结果为:CB:b=4CA:a=8CC:c=6CD:d=2CDobj is destructingCCobj is destructingCAobj is destructingCBobj is destructing思考:将派生类CD改写为如下形式后,请给出输出结果。 class CD:public CB,public CC int d; CC obcc; CB obcb;public:CD(int n1,int n2,int n3,int n4) :CC(n3,n4), CB(n2), obcb(100+n2), obcc(100+n3,100+n4) d=n1; coutCD:d=dendl; ;CD()coutCDobj is destructingendl;/*运行结果为:CB:b=4CA:a=8CC:c=6CA:a=108CC:c=106CB:b=104CD:d=2CDobj is destructingCBobj is destructingCCobj is destructingCAobj is destructingCCobj is destructingCAobj is destructingCBobj is destructingPress any key to continue*/CCobj is destructingCBobj is destrcting例10 (program 8-1 p252)假设公司雇员分为:雇员(employee)、经理(manager)、工程师(engineer)、高级主管(director)。而且假定只关心这几类雇员各自的如下一些数据:employee(雇员)类: 姓名、年龄、工资;manager(经理)类: 姓名、年龄、工资、行政级别;engineer(工程师)类: 姓名、年龄、工资、专业、学位;director(高级主管)类:姓名、年龄、工资、行政级别、职务。 employee manager engineer director 4个类之间的继承关系 #include #include class employee /employee类(类型),将作为其它几个类的基类 short age; float salary;protected: char * name;public: employee (short ag, float sa, char * na)age=ag;salary=sa;name=new charstrlen(na)+1;strcpy(name,na); void print () constcout name: ;coutage : ;coutsalaryendl; employee() deletename; ; class manager:public employee /派生类managerint level;public:manager(short ag, float sa, char* na, int lev) :employee (ag,sa,na) /对基类初始化负责 level=lev; void print()const employee:print(); /调用基类print显示“共性”数据cout level:levelendl; ; /*注意:允许派生类中的print与基类的print重名,按如下规定进行处理:对子类而言,不加类名限定时默认为是处理子类成员,而要访问父类重名成员时,则要通过类名限定*/class engineer:public employee /派生类engineer char speciality,adegree;/*专业:E-电子,M机械,C计算机,A自动化专业; 学位:O博士 , M硕士 , B学士 , N无学位 * / public: engineer (short ag , float sa , char * na ,char sp ,char ad): employee (ag,sa,na)speciality=sp; /派生类的构造函数 adegree =ad;void print()const employee:print(); /调用基类print显示“共性”数据cout speciality: specialityendl; cout academic degree: adegree endl; ;enum ptitle PS,GM,VPS,VGM;class director:public manager /派生类director ptitle post; public: director(short ag ,float sa ,char*na , int lev ,ptitle po): manager(ag,sa,na,lev) post =po ; /派生类的构造函数void print()const manager:print(); cout post: post endl; ;void main() /主函数employee emp1(23,610.5,zhang), emp2(27,824.75,zhao);manager man1(32,812.45,li,11), man2(34,1200.5,cui,7);engineer eng(26,1420.10,meng,E,M);director dir(38,1800.2,zhou,2,GM);emp1.print();emp2.print();man1.print();man2.employee:print(); /调用基类的print eng.print();dir.print(); 程序执行后的显示结果如下: zhang: 23 : 610.5 zhao: 27 : 824.75 li: 32 : 812.45 level:11 cui: 34 : 1200.5 meng: 26 : 1420.1 speciality:E academic degree:M zhou: 38 : 1800.2 level:2 post:1例11 (program 8-2 p257) 分析下述程序中的继承与派生关系. #include classB int priDat; protected: int proDat; public: int publDat; ; class D11 : public B public:void f11() pubDat=11; /OK! 仍为publicproDat=12; /OK! protectedpriDat=13; /ERROR! 基类的私有成员不可访问 ; class D21 : public D11 public:void f21() pubDat=121; /OK! 仍为publicproDat=122; /OK! 仍为protectedpriDat=131; /ERROR! 基类的私有成员不可访问 ; class D12 : protected B public:void f12() pubDat=21; /OK! 变为protectedproDat=22; /OK! 仍为protectedpriDat=23; /ERROR! 基类的私有成员不可访问 ;class D22 : public D12 public:void f22() pubDat=221; /OK! 仍为protectedproDat=222; /OK! 仍为protectedpriDat=223; /ERROR! 基类的私有成员不可访问 ; class D13: private B public:void f13() pubDat=31; /OK! 变为private 可以访问proDat=32; /OK! 变为private 可以访问priDat=33; /ERROR! 基类的私有成员不可访问 ;class D23 : public D13 public:void F23() pubDat=311; /ERROR! 基类的私有成员不可访问proDat=321; /ERROR! 基类的私有成员不可访问priDat=331; /ERROR! 基类的私有成员不可访问 ;void ma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2031年中国氯气瓶阀行业投资前景及策略咨询研究报告
- 山西体育职业学院《数字信号处理实验》2023-2024学年第二学期期末试卷
- 《探索营养奥秘》课件
- 2025至2031年中国旋转窑垃圾焚烧炉行业投资前景及策略咨询研究报告
- 2025至2031年中国挂墙/窗夹式浴室换气扇行业投资前景及策略咨询研究报告
- 2025至2031年中国壁挂式杀菌空气净化器行业投资前景及策略咨询研究报告
- 2025至2031年中国喷干乌龙茶行业投资前景及策略咨询研究报告
- 《化学工程项目建设流程》课件
- 2025至2030年中国餐饮用调味包数据监测研究报告
- 2025至2030年中国配花材料数据监测研究报告
- 供水管道施工方案
- 医疗器械研究预测报告2025-2028年
- 生物尿液的形成和排出 课件-2024-2025学年冀少版生物七年级下册
- 政府专职消防队灭火救援理论基础
- 中职高教版(2023)世界历史-第11课-近代职业教育的兴起和发展【课件】
- 2025届高三部分重点中学3月联合测评(T8联考)地理试卷(河北版含答案)
- 2025至2030年中国三乙二醇单甲醚市场调查研究报告
- 雨污水管道工程专项施工方案
- 中国民族史知到课后答案智慧树章节测试答案2025年春云南大学
- 肝功能检查的试题及答案
- 中国实景演出行业市场集中度、市场运行态势及未来趋势预测报告(2025版)
评论
0/150
提交评论