版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5 5章章 多态与抽象类多态与抽象类2022-2-271面向对象程序设计n 5.1 5.1 类层次的多态问题类层次的多态问题n 5.2 5.2 类型兼容规则类型兼容规则( (重点重点) )n 5.3 5.3 多态的概念多态的概念n 5.4 5.4 多态的分类多态的分类n 5.5 5.5 联编联编n 5.6 5.6 虚函数虚函数( (重点重点) )n 5.7 5.7 抽象类与纯虚函数抽象类与纯虚函数( (重点重点) )2022-2-272面向对象程序设计n【例【例5-15-1】在例】在例4-14-1程序中存在的两个程序中存在的两个不足:不足:(1 1)基类)基类Pay()Pay()和和Dis
2、play()Display()的函数体均为空,的函数体均为空,在实现部分仍要写出函数体,显得冗余。在实现部分仍要写出函数体,显得冗余。(2 2)在主函数中,建立了)在主函数中,建立了4 4个不同类的对象,个不同类的对象,进行了类似的操作,重复写了进行了类似的操作,重复写了4 4遍类似的语句遍类似的语句,程序不够简洁。,程序不够简洁。2022-2-273面向对象程序设计n基类设置成员函数基类设置成员函数Pay()Pay()和和Display()Display()的目的是为了统一规定类簇的基本行的目的是为了统一规定类簇的基本行为,虽有冗余,但也必要。为此,为,虽有冗余,但也必要。为此,C+C+提供
3、了纯虚函数来解决此问题。提供了纯虚函数来解决此问题。 2022-2-274面向对象程序设计n在主函数中建立了在主函数中建立了4 4个不同类的对象,进行个不同类的对象,进行了类似的操作,重复写了了类似的操作,重复写了4 4遍类似的语句。遍类似的语句。n应该怎样有效地来处理它们同样的行为呢应该怎样有效地来处理它们同样的行为呢?我们首先想到的是用循环解决,但调用?我们首先想到的是用循环解决,但调用这些同名函数的对象却不相同。这些同名函数的对象却不相同。n分析这些对象有一个共同点,那就是来自分析这些对象有一个共同点,那就是来自于同一个基类,而基类与派生类对象有什于同一个基类,而基类与派生类对象有什么关
4、系呢?事实上,它们遵循类型兼容规么关系呢?事实上,它们遵循类型兼容规则。则。2022-2-275面向对象程序设计Employee Employee * *emp4=&m1,&t1,&s1,&sm1; /emp4=&m1,&t1,&s1,&sm1; /声明声明抽象类指针数组抽象类指针数组for(int i=0;i4;i+)for(int i=0;iPay(); /empi-Pay(); /单一指令,实现多态,单一指令,实现多态,计算指针指向对象的工资计算指针指向对象的工资empi-Display();/empi-Display();/单一指令,实现多态,单一指令,实现多态,输出指针指向对象的信息
5、输出指针指向对象的信息 2022-2-276面向对象程序设计n类型兼容规则是指在需要基类对象的类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的任何地方,都可以使用公有派生类的对象来替代。对象来替代。2022-2-277面向对象程序设计n通过公有继承,派生类得到了基类中通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成除构造函数、析构函数之外的所有成员。这样,员。这样,公有派生类实际就具备了公有派生类实际就具备了基类的所有功能基类的所有功能,凡是基类能解决的,凡是基类能解决的问题,公有派生类都可以解决。问题,公有派生类都可以解决。 2022-2-278面向对象程序设
6、计n类型兼容规则中所指替代包括以下情类型兼容规则中所指替代包括以下情况:况:(1 1)派生类的对象可以赋值给基类的对象。)派生类的对象可以赋值给基类的对象。(2 2)派生类的对象可以初始化基类的引用。)派生类的对象可以初始化基类的引用。(3 3)派生类的对象的地址可以赋值给基类的指)派生类的对象的地址可以赋值给基类的指针变量。针变量。n在替代之后,派生类对象就可以作为在替代之后,派生类对象就可以作为基类的对象使用,但只能访问从基类基类的对象使用,但只能访问从基类继承的成员。继承的成员。2022-2-279面向对象程序设计n【例【例5-35-3】示例类型兼容规则的应用。】示例类型兼容规则的应用。
7、n教材教材P261P261,该程序的运行结果为:,该程序的运行结果为:Base classBase classBase classBase classBase classBase classDerivel classDerivel classDerive2 class Derive2 class 2022-2-2710面向对象程序设计n根据类型兼容规则,基类指针根据类型兼容规则,基类指针p p可以指可以指向派生类对象向派生类对象obj2obj2、obj3obj3(即派生类(即派生类对象可以代替基类对象,给基类指针对象可以代替基类对象,给基类指针赋值),但编译时,编译器根据赋值),但编译时,编译
8、器根据p p的类的类型是基类型,自动调用基类的型是基类型,自动调用基类的who()who(),所以结果如上所示。所以结果如上所示。 2022-2-2711面向对象程序设计n【思考题【思考题5-35-3】如果基类指针要访问派】如果基类指针要访问派生类的生类的who()who(),怎么办?,怎么办?n nC+C+提供了多态机制来解决这个问题。提供了多态机制来解决这个问题。n类型兼容规则是类型兼容规则是C+C+多态的重要基础。多态的重要基础。 2022-2-2712面向对象程序设计n多态(多态(PolymorphismPolymorphism)是指具有相似)是指具有相似功能的不同函数使用同一个名称来
9、实功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数的调用这些具有不同功能的同名函数的特性。特性。 2022-2-2713面向对象程序设计nC+C+支持的多态可以分为四种类型:支持的多态可以分为四种类型:重载多态:函数重载和运算符重载重载多态:函数重载和运算符重载强制多态:强制类型转换强制多态:强制类型转换包含多态:虚函数包含多态:虚函数参数多态:函数模板和类模板参数多态:函数模板和类模板 2022-2-2714面向对象程序设计n联编是指把一个标识符名和一个存储联编是指把一个标识符名和一个存储地址联系在一起的过程。即函
10、数调用地址联系在一起的过程。即函数调用与某个函数在多态的实现过程中,确与某个函数在多态的实现过程中,确定调用哪个同名联系的过程,又称绑定调用哪个同名联系的过程,又称绑定。分为:定。分为:n静态联编静态联编n动态联编动态联编2022-2-2715面向对象程序设计n静态联编是在编译阶段完成的联编。静态联编是在编译阶段完成的联编。例例5-25-2、例、例5-35-3及以前的函数重载都是及以前的函数重载都是采用静态联编方式。采用静态联编方式。n例例5-45-4,教材,教材P265P265,是静态联编。,是静态联编。n动态联编是在运行阶段完成的联编。动态联编是在运行阶段完成的联编。 2022-2-271
11、6面向对象程序设计n在例在例5-45-4中,静态联编把基类指针中,静态联编把基类指针psps指指向的对象绑定到基类上,而在运行时向的对象绑定到基类上,而在运行时进行动态联编将把进行动态联编将把psps指向的对象绑定指向的对象绑定到派生类上。到派生类上。2022-2-2717面向对象程序设计n可见,同一个指针,在不同阶段被绑可见,同一个指针,在不同阶段被绑定的类对象将是不同的,进而被关联定的类对象将是不同的,进而被关联的类成员函数也是不同的。的类成员函数也是不同的。n如何来确定是用静态联编还是用动态如何来确定是用静态联编还是用动态联编呢?联编呢?nC+C+规定,动态联编通过继承和虚函数规定,动态
12、联编通过继承和虚函数来实现。来实现。2022-2-2718面向对象程序设计n虚函数是动态联编的基础。下面介绍虚函数是动态联编的基础。下面介绍虚函数。虚函数。2022-2-2719面向对象程序设计n虚函数就是在基类中被关键字虚函数就是在基类中被关键字virtualvirtual说明、并在一个或多个派生类中被重说明、并在一个或多个派生类中被重新定义的成员函数。新定义的成员函数。2022-2-2720面向对象程序设计n声明虚函数的格式如下:声明虚函数的格式如下:virtual virtual (););2022-2-2721面向对象程序设计n在派生类中重新定义虚函数时,其函在派生类中重新定义虚函数时
13、,其函数原型包括返回类型、函数名、参数数原型包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基个数与参数类型的顺序,都必须与基类中的原型必须相同。类中的原型必须相同。2022-2-2722面向对象程序设计n一个函数一旦被声明为虚函数,则无一个函数一旦被声明为虚函数,则无论声明它的类被继承了多少层,在每论声明它的类被继承了多少层,在每一层派生类中该函数都保持虚函数特一层派生类中该函数都保持虚函数特性。因此,在派生类中重新定义该函性。因此,在派生类中重新定义该函数时,可以省略关键字数时,可以省略关键字virtualvirtual。但是。但是,为了提高程序的可读性,往往不省,为了提高程序的可
14、读性,往往不省略。略。2022-2-2723面向对象程序设计n在程序运行时,不同类的对象调用各在程序运行时,不同类的对象调用各自的虚函数,这就是运行时多态。自的虚函数,这就是运行时多态。2022-2-2724面向对象程序设计n【例【例5-55-5】将例】将例5-45-4基类的成员函数基类的成员函数print()print()设为虚函数,采用对象指针调设为虚函数,采用对象指针调用虚函数,进而实现动态联编。用虚函数,进而实现动态联编。 2022-2-2725面向对象程序设计n该程序的运行结果为该程序的运行结果为: :A studentA studentA graduate studentA gra
15、duate studentA studentA studentA studentA studentA graduate studentA graduate student2022-2-2726面向对象程序设计n【思考题【思考题5-55-5】如果将例】如果将例5-55-5中中StudentStudent类改类改为:为:class Studentclass Student public:public: virtual void print(); virtual void print(); /虚函数的声明虚函数的声明;virtual void Student:print() /virtual voi
16、d Student:print() /虚函数的实现虚函数的实现 coutA studentendl; coutA studentendl; 2022-2-2727面向对象程序设计n注意:当有虚函数声明时,注意:当有虚函数声明时,virtualvirtual关关键字只用在虚函数的声明中,不能用键字只用在虚函数的声明中,不能用在虚函数定义中。在虚函数定义中。 2022-2-2728面向对象程序设计n【思考题【思考题5-45-4】将例】将例5-55-5中用中用对象对象调用调用虚函数,其结果如何?虚函数,其结果如何?n【注意】只有通过对象指针或对象引【注意】只有通过对象指针或对象引用来调用虚函数,才能
17、实现动态联编用来调用虚函数,才能实现动态联编。如果采用对象来调用虚函数,则采。如果采用对象来调用虚函数,则采用的是静态联编方式。用的是静态联编方式。2022-2-2729面向对象程序设计n【例【例5-65-6】将例】将例5-45-4基类的成员函数基类的成员函数print()print()设为虚函数,采用对象引用调设为虚函数,采用对象引用调用虚函数,进而实现动态联编。用虚函数,进而实现动态联编。 2022-2-2730面向对象程序设计n运行结果表明,只要定义一个基类的运行结果表明,只要定义一个基类的对象指针或对象引用,就可以调用期对象指针或对象引用,就可以调用期望的虚函数。望的虚函数。n思考题思
18、考题: :如果将对象引用或对象指针换如果将对象引用或对象指针换为对象为对象, ,那么是静态联编。那么是静态联编。2022-2-2731面向对象程序设计n在实际应用中,编程人员不必过多地在实际应用中,编程人员不必过多地考虑类的层次关系,无须显式地写出考虑类的层次关系,无须显式地写出虚函数的路径,只须将对象指针指向虚函数的路径,只须将对象指针指向相应的派生类或引用相应的对象,通相应的派生类或引用相应的对象,通过动态联编就可以对消息做出正确的过动态联编就可以对消息做出正确的反应。反应。2022-2-2732面向对象程序设计(1 1)如果你期望在派生类中重新定义一)如果你期望在派生类中重新定义一个成员
19、函数,那么你就应该在基类中个成员函数,那么你就应该在基类中把该函数设为把该函数设为virtualvirtual。(2 2)以单一指令调用不同函数,这种性)以单一指令调用不同函数,这种性质就是质就是 多态多态 。(3 3)虚函数是)虚函数是C+C+语言的多态性质和动语言的多态性质和动态绑定的关键。态绑定的关键。(4 4)虚函数派生下去仍是虚函数,而且)虚函数派生下去仍是虚函数,而且可以省略可以省略virtualvirtual关键词。关键词。2022-2-2733面向对象程序设计n【思考题【思考题5-85-8】虚函数与虚拟继承有什】虚函数与虚拟继承有什么相似的地方?他们之间有没有联系么相似的地方?
20、他们之间有没有联系?n如果能了解如果能了解C+C+编译器对于虚函数的实编译器对于虚函数的实现形式,我们就能知道为什么虚函数现形式,我们就能知道为什么虚函数可以实现动态绑定。下面介绍可以实现动态绑定。下面介绍虚函数虚函数表表。2022-2-2734面向对象程序设计n为了达到动态绑定的目的,为了达到动态绑定的目的,C+C+编译器编译器通过某个表格,在执行期间通过某个表格,在执行期间“间接间接”调用实际上欲绑定的函数,这样的表调用实际上欲绑定的函数,这样的表格称为虚函数表(格称为虚函数表(vtablevtable)。)。2022-2-2735面向对象程序设计n每一个含有虚函数的类,编译器都为每一个含
21、有虚函数的类,编译器都为它做一个虚函数表,表中的每一项都它做一个虚函数表,表中的每一项都指向一个虚函数的地址,实现上是一指向一个虚函数的地址,实现上是一个函数指针的数组。此外,编译器也个函数指针的数组。此外,编译器也会为类加上一个数据成员,是一个指会为类加上一个数据成员,是一个指向该虚函数表的指针(向该虚函数表的指针(vptrvptr)。)。 2022-2-2736面向对象程序设计Wind objectWind objectvptrvptrStringed objectStringed objectvptrvptrPercussion objectPercussion objectvptrvp
22、tr&Wind:play()&Wind:play()& Percussion:play()& Percussion:play()& Stringed:play()& Stringed:play()2022-2-2737面向对象程序设计n当通过对象调用虚函数时,是通过当通过对象调用虚函数时,是通过vptrvptr找到虚函数表,再找出虚函数的找到虚函数表,再找出虚函数的真正地址。真正地址。n至于基类指针或引用指向派生类对象至于基类指针或引用指向派生类对象时,调用的是派生类虚函数,其奥妙时,调用的是派生类虚函数,其奥妙在于虚函数表以及一种间接调用方式在于虚函数表以及一种间接调用方式:2022-2-2
23、738面向对象程序设计n虚函数表中的内容依据类中的虚函数虚函数表中的内容依据类中的虚函数声明次序,一一填入函数指针。声明次序,一一填入函数指针。n派生类会继承基类的虚函数表(以及派生类会继承基类的虚函数表(以及其它所有可以继承的成员),其它所有可以继承的成员),我们我们在在派生类中改写虚函数时,虚函数表也派生类中改写虚函数时,虚函数表也受到了影响,表中每一项所指向函数受到了影响,表中每一项所指向函数地址将不再是基类中的函数地址,而地址将不再是基类中的函数地址,而是派生类的函数地址。是派生类的函数地址。2022-2-2739面向对象程序设计n因此,一个指向因此,一个指向StudentStuden
24、t对象的指针,对象的指针,所调用的所调用的printprint函数就是函数就是Student:print(), Student:print(), 而一个指向而一个指向GStudentGStudent对象的指针,所调用的对象的指针,所调用的printprint函数就是函数就是GStudent:print()GStudent:print()。 2022-2-2740面向对象程序设计n将一个类的成员函数定义为虚函数有将一个类的成员函数定义为虚函数有利于编程,尽管它会引起一些额外的利于编程,尽管它会引起一些额外的开销。开销。n那么,是否所有成员函数都可以声明那么,是否所有成员函数都可以声明为虚函数呢?
25、为虚函数呢?2022-2-2741面向对象程序设计n一般来说,可将类簇中具有共性的成一般来说,可将类簇中具有共性的成员函数声明为虚函数,而具有个性的员函数声明为虚函数,而具有个性的函数没有必要声明为虚函数。但是下函数没有必要声明为虚函数。但是下面的情况例外:面的情况例外:2022-2-2742面向对象程序设计n(1)(1)静态成员函数不能声明为虚函数。因为静态成员函数不能声明为虚函数。因为静态成员函数不属于某一个对象,没有多静态成员函数不属于某一个对象,没有多态性的特征。态性的特征。n(2)(2)构造函数不能是虚函数。构造函数是在构造函数不能是虚函数。构造函数是在定义对象时被调用,完成对象的初
26、始化,定义对象时被调用,完成对象的初始化,此时对象还没有完全建立。虚函数作为运此时对象还没有完全建立。虚函数作为运行时的多态性的基础,主要是针对对象的行时的多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的。,而构造函数是在对象产生之前运行的。所以,将构造函数声明为虚函数是没有意所以,将构造函数声明为虚函数是没有意义的。义的。 2022-2-2743面向对象程序设计n(3)(3)内联成员函数不能声明为虚函数。内联成员函数不能声明为虚函数。因为内联函数的执行代码是明确的,因为内联函数的执行代码是明确的,在编译时已被替换,没有多态性的特在编译时已被替换,没有多态性的特征。如果将那些在
27、类声明时就定义内征。如果将那些在类声明时就定义内容的成员函数声明为虚函数,此时函容的成员函数声明为虚函数,此时函数不是内联函数,而以多态性出现。数不是内联函数,而以多态性出现。2022-2-2744面向对象程序设计n(4)(4)析构函数可以是虚函数,且往往被析构函数可以是虚函数,且往往被定义为虚函数。一般来说,若某类中定义为虚函数。一般来说,若某类中有虚函数,则其析构函数也应当定义有虚函数,则其析构函数也应当定义为虚函数。为虚函数。2022-2-2745面向对象程序设计n特别是需要析构函数完成一些有意义特别是需要析构函数完成一些有意义的操作,如释放内存时,由于实施多的操作,如释放内存时,由于实
28、施多态性时是通过将基类的指针指向派生态性时是通过将基类的指针指向派生类的对象来完成的,如果删除该指针类的对象来完成的,如果删除该指针,就会调用该指针指向的派生类的析,就会调用该指针指向的派生类的析构函数,而派生类的析构函数又自动构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生调用基类的析构函数,这样整个派生类的对象才被完全释放。类的对象才被完全释放。2022-2-2746面向对象程序设计n因此,析构函数常被声明为虚函数。因此,析构函数常被声明为虚函数。如果一个类的析构函数是虚函数,那如果一个类的析构函数是虚函数,那么,由它派生的所有子类的析构函数么,由它派生的所有子类的析构函数
29、也是虚函数。也是虚函数。n下面介绍虚析构函数。下面介绍虚析构函数。2022-2-2747面向对象程序设计n虚析构函数的声明格式如下:虚析构函数的声明格式如下:virtual virtual ();();n【例【例5-75-7】虚析构函数示例。教材】虚析构函数示例。教材P272P2722022-2-2748面向对象程序设计n利用虚函数可以使所设计的软件系统利用虚函数可以使所设计的软件系统变得灵活,提高了代码的可重用性。变得灵活,提高了代码的可重用性。n虚函数为一个类簇中所有派生类的同虚函数为一个类簇中所有派生类的同一行为提供了统一的接口,使得程序一行为提供了统一的接口,使得程序员在使用一个类簇时
30、只须记住一个接员在使用一个类簇时只须记住一个接口即可。口即可。2022-2-2749面向对象程序设计n(1)(1)如果在派生类中没有重新定义虚函如果在派生类中没有重新定义虚函数,则派生类的对象将使用基类的虚数,则派生类的对象将使用基类的虚函数代码。函数代码。n(2)(2)在派生类中重新定义虚函数时,必在派生类中重新定义虚函数时,必须保证函数值类型和参数与基类中的须保证函数值类型和参数与基类中的声明完全一致。否则,派生类的函数声明完全一致。否则,派生类的函数也不具备多态性。也不具备多态性。2022-2-2750面向对象程序设计n根据上述介绍,我们可以将例根据上述介绍,我们可以将例5-15-1的的
31、Pay()Pay()和和Display()Display()定义为虚函数,从定义为虚函数,从而解决例而解决例4-14-1遗留下来的第二个问题。遗留下来的第二个问题。2022-2-2751面向对象程序设计n另外,公司的人员有另外,公司的人员有4 4类,它们的基类类,它们的基类EmployeeEmployee实际上是不需要实例化对象实际上是不需要实例化对象的,的,EmployeeEmployee也无法为虚函数定义具也无法为虚函数定义具体的实现,这时可以将体的实现,这时可以将EmployeeEmployee声明声明为纯虚函数。包含纯虚函数的类称为为纯虚函数。包含纯虚函数的类称为抽象类。抽象类。202
32、2-2-2752面向对象程序设计n抽象类专门作为基类派生新类。抽象抽象类专门作为基类派生新类。抽象类的主要作用是将有关的派生类组织类的主要作用是将有关的派生类组织在一个继承层次结构中,由抽象类为在一个继承层次结构中,由抽象类为它们提供一个公共的根,相关的派生它们提供一个公共的根,相关的派生类就从这个根派生出来。类就从这个根派生出来。 n含有纯虚函数的类就是抽象类。含有纯虚函数的类就是抽象类。 2022-2-2753面向对象程序设计n在例在例4-14-1中遗留的另一个问题是中遗留的另一个问题是: : employeeemployee类的成员函数类的成员函数pay()pay()和和display(
33、)display()的函数体为空的函数体为空, ,在实现部分在实现部分仍要写出函数体仍要写出函数体, ,显得冗余。显得冗余。n事实上,事实上,employeeemployee类的成员函数根本类的成员函数根本不会被调用,所以不必定义它。于是不会被调用,所以不必定义它。于是+提供了纯虚函数来解决这个问题提供了纯虚函数来解决这个问题。 2022-2-2754面向对象程序设计n纯虚函数是为了解决在基类中无法实纯虚函数是为了解决在基类中无法实现的函数现的函数, ,而在派生类中再给出函数的而在派生类中再给出函数的具体实现,它只需要在基类中说明函具体实现,它只需要在基类中说明函数原型用来规定整个类簇的统一接
34、口数原型用来规定整个类簇的统一接口形式。形式。2022-2-2755面向对象程序设计n纯虚函数的声明格式为:纯虚函数的声明格式为:virtual virtual ()=0;)=0;2022-2-2756面向对象程序设计n纯虚函数与函数体为空的虚函数是有纯虚函数与函数体为空的虚函数是有区别的:区别的:n前者有函数体前者有函数体, ,而后者没有函数体;而后者没有函数体;n前者所在的类是抽象类前者所在的类是抽象类, ,不能直接进行实例化不能直接进行实例化, ,而后者所在的类是可以实例化的。而后者所在的类是可以实例化的。 2022-2-2757面向对象程序设计n【例【例5-95-9】示例纯虚函数及抽象
35、类。计】示例纯虚函数及抽象类。计算图形面积。例如,要定义一个算图形面积。例如,要定义一个SquareSquare类和类和CircleCircle类,它们有共同的类,它们有共同的属性属性x x、y y,以及共同的操作,以及共同的操作setvalue()setvalue()和和area()area(),由于,由于area()area()在在两个类的计算方法不同,但又属于一两个类的计算方法不同,但又属于一个类簇,为此,定义一个抽象类个类簇,为此,定义一个抽象类ShapeShape,统一它们的属性和操作。抽象类和,统一它们的属性和操作。抽象类和纯虚函数的纯虚函数的UMLUML图表示如图图表示如图5-35-3所示。所示。2022-2-2758面向对象程序设计ShapeShape# x:int# x:int# y:int# y:int+ setvalu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数据分析-成对数据的统计分析+课件-2026届高三数学二轮复习
- 基本外科考试试题及答案
- 2026五年级数学 人教版数学乐园植树问题变式四
- 2026年长沙出版中考试卷及答案
- 2026三年级数学下册 年月日单元易错纠正
- 2026二年级数学下册 质量单位的认识
- 供应商服务评价制度
- 2026二年级数学上册 加减法知识点
- 2026九年级上语文组织技巧指导方法
- 青协项目部奖惩制度范本
- 5.1人民代表大会制度 课件(23张幻灯片)+内嵌视频 道德与法治统编版八年级下册
- 动火作业与受限空间安全管理标准
- 2026年包头轻工职业技术学院单招综合素质考试题库附答案详解(基础题)
- 2026年当辅警笔试题库及一套完整答案
- 2026年兴安职业技术学院单招职业倾向性测试题库及答案详解(新)
- 国家基层糖尿病防治管理指南(2025版)
- 2025年国企招聘考试(建筑工程及造价)经典试题及答案
- (2026)中华人民共和国海关注册登记和备案企业信用管理办法解读课件
- 2025CSCO胰腺癌诊疗指南课件
- 慈善基金会内控制度
- DB15∕T 385-2025 行业用水定额
评论
0/150
提交评论