




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第8 8章章 继承和派生继承和派生 在在C+C+中可重用性是通过继承中可重用性是通过继承(inheritance)(inheritance)这一这一机制来实现的。继承是机制来实现的。继承是C+C+的一个重要组成部分。的一个重要组成部分。8.1 8.1 继承和派生的概念继承和派生的概念 在在C+C+中,所谓中,所谓“承继就是在一个已存在的类的基础上建承继就是在一个已存在的类的基础上建立一个新的类。一个新类从已有的类那里获得其已有特性,立一个新的类。一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的这种现象称为类的继承。通过继承,一个新建子类从已有的父类那
2、里获得父类的特性。从另一角度说,从已有的类父类那里获得父类的特性。从另一角度说,从已有的类( (父父类类) )产生一个新的子类,称为类的派生。类的继承是用已有产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。的类来建立专用类的编程技术。8.1.1基类与派生类基类与派生类 1.继承与派生继承与派生交通工具交通工具飞机飞机滑翔机滑翔机直升飞机直升飞机喷气式飞机喷气式飞机交通工具交通工具飞机飞机滑翔机滑翔机直升飞机直升飞机喷气式飞机喷气式飞机已存在的类已存在的类( (例如例如“交通工具交通工具”) )称为称为“基类或基类或“父类父类”。新建立的类新建立的类( (例如例如“飞
3、机飞机”) )称为称为“派生类或派生类或“子类子类”。一个基类可以派生出多个派生类,每一个派生类又可以作一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对为基类再派生出新的派生类,因此基类和派生类是相对而言的。而言的。2.基类与派生类基类与派生类 请注意图中箭头的方向,在本书中约定,箭头表示继承的方向,从派生类指向基类。.2继承与派生的作用继承与派生的作用 1.1.避免公用代码的重复开发,在减少代码和数据冗余的同时,避免公用代码的重复开发,在减少代码和数据冗余的同时,节省程序开发的时间,提高程序开发的效率和质量。节省程序开发的时间
4、,提高程序开发的效率和质量。2.2.通过增强代码一致性来减少模块间的接口和界面。通过增强代码一致性来减少模块间的接口和界面。3.3.通过层次关系来组织对象,使得高层类作为低层类的抽象,通过层次关系来组织对象,使得高层类作为低层类的抽象,有利于程序员掌握对象的共性,在此基础上,就能更快地掌握低层有利于程序员掌握对象的共性,在此基础上,就能更快地掌握低层类中的个性特征,给编程与代码重用带来方便。类中的个性特征,给编程与代码重用带来方便。.3派生类的声明派生类的声明 声明一个派生类的一般格式为:声明一个派生类的一般格式为:class class 派生类名派生类名 : : 派生存取说明
5、符可省)派生存取说明符可省) 基类名基类名 /派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数; ; 派生类名是要从基类派生出的新类的名字,派生类名是要从基类派生出的新类的名字,“基类名是一个基类名是一个已经定义好的基类的名字,已经定义好的基类的名字,“派生存取说明符可以是关键字派生存取说明符可以是关键字publicpublic或或protectedprotected或或privateprivate,派生存取说明符的作用会在后面,派生存取说明符的作用会在后面详细介绍,详细介绍,“派生存取说明符可以省略,默认为派生存取说明符可以省略,默认为privateprivate,即私有派生。即
6、私有派生。 /定义一个基类定义一个基类StudentStudent类)类)class Studentclass Student public:public: char name10; / char name10; /姓名姓名 int age;int age; / /年龄年龄 char sex;char sex; / /性别性别 char classname20;char classname20;/班级名称班级名称;/定义一个派生类定义一个派生类GraduateStudentGraduateStudent类)类)class GraduateStudent : public Studentclas
7、s GraduateStudent : public Student public:public:char Advisorname10; /char Advisorname10; /导师导师int qualifiergrade;int qualifiergrade; / /资格考试分资格考试分; ; 8.2 8.2 派生类成员的访问控制派生类成员的访问控制 .1派生类成员访问控制简介派生类成员访问控制简介从一个基类派生出一个子类时,可以通过指定派生时的存取从一个基类派生出一个子类时,可以通过指定派生时的存取说明符来实现对派生类成员的访问控制。说明符来实现对派生类成员的访问控制。
8、 既然派生类中包含基类成员和派生类自己增加的成员,就既然派生类中包含基类成员和派生类自己增加的成员,就产生了这两部分成员的关系和访问属性的问题。在建立派产生了这两部分成员的关系和访问属性的问题。在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公生类的私有成员,把基类的公用成员直接作为派生类的公用成员。实际上,对基类成员和派生类自己增加的成员是用成员。实际上,对基类成员和派生类自己增加的成员是按不同的原则处理的。按不同的原则处理的。8.2.2 private8.2.2 private、pr
9、otectedprotected与与publicpublic类成员类成员 1.private1.private类成员类成员 一个类中的私有一个类中的私有privateprivate成员包括数据成员和成员函数)成员包括数据成员和成员函数)只能被它们所在类的成员函数和友元函数访问,在只能被它们所在类的成员函数和友元函数访问,在C+C+中类成员中类成员存取说明符缺省的情况下的存取特征都是私有的存取说明符缺省的情况下的存取特征都是私有的privateprivate)。)。 【例【例8.18.1】 类私有成员的定义和访问类私有成员的定义和访问 #include #include class Person
10、class Person /Person/Person类的三个私有成员类的三个私有成员 char name10; /char name10; /姓名姓名private:private: int age; int age; / /年龄年龄 char sex;char sex; / /性别性别;main()main() Person P1;Person P1; P1.age=20; P1.age=20;/非法非法 coutP1.nameendl;coutP1.nameendl; / /非法非法 return 0;return 0; 2.public2.public类成员类成员 一个类中的公有一个类
11、中的公有(public)(public)成员包括数据成员和成员函数)成员包括数据成员和成员函数)可以被程序中任何代码包括函数访问,一般情况下,应尽可以被程序中任何代码包括函数访问,一般情况下,应尽量将类的数据成员声明为私有量将类的数据成员声明为私有privateprivate),然后为需要被类外),然后为需要被类外部访问的数据成员提供公有的成员函数,实现对私有成员的设部访问的数据成员提供公有的成员函数,实现对私有成员的设置和访问,这种结构能够向类的客户很好的隐藏实现方法,在置和访问,这种结构能够向类的客户很好的隐藏实现方法,在有效减少错误的同时,可以增强程序的可修改性。有效减少错误的同时,可以
12、增强程序的可修改性。 3.tected类成员类成员 使用使用protectedprotected声明的称为保护成员。任何一个类的保护成员声明的称为保护成员。任何一个类的保护成员仅可以被其自己和派生类的所有非静态成员函数和友元函数直仅可以被其自己和派生类的所有非静态成员函数和友元函数直接访问,也就是说其他的外部函数是不能访问它的。因此,对接访问,也就是说其他的外部函数是不能访问它的。因此,对于那些既要对外界隐藏,又要能被派生类访问的成员,可以将于那些既要对外界隐藏,又要能被派生类访问的成员,可以将它们声明为保护成员。它们声明为保护成员。 如果基类声明了私有成员,那么任
13、何派生类都是不能访问它如果基类声明了私有成员,那么任何派生类都是不能访问它们的,若希望在派生类中能访问它们,应当把它们声明为保们的,若希望在派生类中能访问它们,应当把它们声明为保护成员。如果在一个类中声明了保护成员,就意味着该类可护成员。如果在一个类中声明了保护成员,就意味着该类可能要用作基类,在它的派生类中会访问这些成员。能要用作基类,在它的派生类中会访问这些成员。.3三种派生方式的定义三种派生方式的定义 1.1.私有私有privateprivate派生派生 在声明一个派生类时将派生方式指定为在声明一个派生类时将派生方式指定为privateprivate的,称为私有派生,的,
14、称为私有派生,用私有派生方式建立的派生类称为私有派生类用私有派生方式建立的派生类称为私有派生类 ,其基类称为私有,其基类称为私有基类。基类。由私有派生得到的派生类,它从基类继承的成员都将变为私有由私有派生得到的派生类,它从基类继承的成员都将变为私有成员,也就是说通过私有派生,派生类从基类继承来的公有成成员,也就是说通过私有派生,派生类从基类继承来的公有成员和保护成员都将变成派生类的私有成员,这些成员将只能被员和保护成员都将变成派生类的私有成员,这些成员将只能被派生类的成员函数和友元函数访问。需要重点说明的是,基类派生类的成员函数和友元函数访问。需要重点说明的是,基类的私有成员经过私有派生后继续
15、保持其基类的私有成员身份,的私有成员经过私有派生后继续保持其基类的私有成员身份,无法被派生类访问。无法被派生类访问。 2.2.维护维护protectedprotected派生派生由保护派生得到的派生类,它从基类继承的公有和保护成员都由保护派生得到的派生类,它从基类继承的公有和保护成员都将变为派生类的保护成员。基类的私有成员经过保护派生后继将变为派生类的保护成员。基类的私有成员经过保护派生后继续保持其基类的私有成员身份,依然无法被派生类访问。续保持其基类的私有成员身份,依然无法被派生类访问。 保护派生的特点是保护派生的特点是: : 基类的公用成员和保护成员在派生基类的公用成员和保护成员在派生类中
16、都成了保护成员,其私有成员仍为基类私有。也就是把类中都成了保护成员,其私有成员仍为基类私有。也就是把基类原有的公用成员也保护起来,不让类外任意访问。基类原有的公用成员也保护起来,不让类外任意访问。3.3.公有公有publicpublic派生派生 由公有派生得到的派生类,它从基类继承的成员都将维持原由公有派生得到的派生类,它从基类继承的成员都将维持原有访问控制特征,即通过公有派生后,派生类从基类继承的有访问控制特征,即通过公有派生后,派生类从基类继承的公有成员在派生类中仍然是公有成员,保护成员仍然是保护公有成员在派生类中仍然是公有成员,保护成员仍然是保护成员,而基类的私有成员经过公有派生后继续保
17、持其基类的成员,而基类的私有成员经过公有派生后继续保持其基类的私有成员身份,依然无法被派生类访问。私有成员身份,依然无法被派生类访问。 .4派生类成员访问控制规则派生类成员访问控制规则 1.1.派生类中新增成员的访问控制遵循类成员访问控制的规则。派生类中新增成员的访问控制遵循类成员访问控制的规则。 存取说明符存取说明符访问控制规则访问控制规则PrivatePrivate此派生类的非静态成员函数和友元函数可以直接访问此派生类的非静态成员函数和友元函数可以直接访问ProtectedProtected此派生类和其子类非静态成员函数和友元函数可以访问此派生类和其子类非静态成员函数和友元
18、函数可以访问PublicPublic任何非静态成员函数,友元函数和非成员函数都可以直接访任何非静态成员函数,友元函数和非成员函数都可以直接访问问2. 2. 类成员在派生类中的访问控制规则类成员在派生类中的访问控制规则 基类成员的存基类成员的存取说明符取说明符派生方式派生方式publicpublic派生派生protectedprotected派生派生privateprivate派生派生PrivatePrivate在派生类中被隐藏在派生类中被隐藏在派生类中被隐藏在派生类中被隐藏在派生类中被隐藏在派生类中被隐藏ProtectedProtected派生类中为派生类中为protectedprotecte
19、d派生类中为派生类中为protectedprotected派生类中为派生类中为privateprivatePublicPublic派生类中为派生类中为publicpublic派生类中为派生类中为protectedprotected派生类中为派生类中为privateprivate留意:不管是何种派生,基类的留意:不管是何种派生,基类的privateprivate成员永远都不成员永远都不能被其派生类直接访问,但可以通过基类的能被其派生类直接访问,但可以通过基类的publicpublic和和protectedprotected成员函数访问。成员函数访问。 8.3 8.3 派生类的构造函数和析构函数派
20、生类的构造函数和析构函数.1派生类的构造函数和析构函数的声明派生类的构造函数和析构函数的声明类的构造函数是类的一种特殊的成员函数,它的作用主要类的构造函数是类的一种特殊的成员函数,它的作用主要是为对象分配内存、进行初始化;而析构函数它的作用与是为对象分配内存、进行初始化;而析构函数它的作用与构造函数相反。构造函数相反。 派生类的构造函数声明格式如下派生类的构造函数声明格式如下 :派生类的构造函数名称参数表)派生类的构造函数名称参数表): : 基类的构造函数名参数表)基类的构造函数名参数表) /派生类构造函数体派生类构造函数体 class Pointclass Point int
21、 x,y; int x,y;public:public:Point(int a,int b)Point(int a,int b)/基类的构造函数基类的构造函数 x=a;x=a;y=b;y=b;cout”Constructing Point class n”;cout”Constructing Point class n”; Point()Point()/基类的析构函数基类的析构函数 cout”Destructing Point class n”;cout”Destructing Point class n”; ;class Circle :public Pointclass Circle :p
22、ublic Point double radius;double radius;public : public : Circle (double r,int a,int b):Point(a,b)/Circle (double r,int a,int b):Point(a,b)/派生类的构造函数派生类的构造函数 radius =r;radius =r;cout”Constructing Circle class n”;cout”Constructing Circle class n”; Circle () Circle ()/派生类的析构函数派生类的析构函数 cout”Destructing
23、Circle class n”;cout”Destructing Circle class n”; ;派生类中含有对象成员时,其构造函数的声明格式如下:派生类中含有对象成员时,其构造函数的声明格式如下: 派生类的构造函数名称参数表)派生类的构造函数名称参数表): : 基类的构造函数名参数表)基类的构造函数名参数表), ,对象成员名对象成员名1 1参数表)参数表),对象成员名对象成员名N N参数表)参数表) /派生类构造函数体派生类构造函数体 class Circle2 :public Pointdouble radius;Point P1;public : Circle2 (double r,
24、int a,int b):Point(a,b),P1(a,b)/派生类的构造函数,定义时派生类的构造函数,定义时/指定了基类的构造函数和对象成员指定了基类的构造函数和对象成员P1的构造函数的构造函数radius =r;cout”Constructing Circle2 class n”; Circle2 ()/派生类的析构函数派生类的析构函数cout”Destructing Circle2 class n”; .2派生类的构造函数和析构函数的构造规则派生类的构造函数和析构函数的构造规则 1. 1. 基类具有显式的构造函数时基类具有显式的构造函数时(1 1基类具有不带参数的构造函
25、数基类具有不带参数的构造函数派生类既可以自己不定义构造函数,也可以根据需要定义自己派生类既可以自己不定义构造函数,也可以根据需要定义自己的构造函数,构造函数可以带参数也可以省略,在派生类中定的构造函数,构造函数可以带参数也可以省略,在派生类中定义构造函数时还可省略义构造函数时还可省略“:基类构造函数名参数表):基类构造函数名参数表)”。 (2 2基类仅有带参数的构造函数基类仅有带参数的构造函数 派生类必须显式的定义其构造函数,并在声明时指定其基类的某派生类必须显式的定义其构造函数,并在声明时指定其基类的某一构造函数和参数表,把参数传递给基类构造函数。一构造函数和参数表,把参数传递给基类构造函数
26、。 2. 2. 基类具有隐式的构造函数时基类具有隐式的构造函数时 当基类没有显式的定义即隐式的定义构造函数时,派生类当基类没有显式的定义即隐式的定义构造函数时,派生类可以根据需要定义自己的构造函数,派生类构造函数的参数表、可以根据需要定义自己的构造函数,派生类构造函数的参数表、基类的构造函数名和参数表都可以根据需要省略。基类的构造函数名和参数表都可以根据需要省略。 .3派生类构造函数和析构函数的调用顺序派生类构造函数和析构函数的调用顺序1. 1. 构造函数的调用顺序构造函数的调用顺序 派生类对象创建的时候,构造函数的执行顺序为:派生类对象创建的时候,构造函数的执行顺序为:(1基
27、类的构造函数(2对象成员的构造函数(3派生类自身的构造函数 2. 2. 析构函数的调用顺序与构造函数的调用顺序正好相反。即析构函数的调用顺序与构造函数的调用顺序正好相反。即 (1 1派生类自身的析构函数派生类自身的析构函数(2 2对象成员的构造函数对象成员的构造函数(3 3基类的析构函数基类的析构函数 【例【例8.68.6】派生类】派生类Circle2Circle2的构造函数和析构函数的执行顺序的构造函数和析构函数的执行顺序/Point/Point和和Circle2Circle2类的定义类的定义main()main() Circle2 C1(0.0,1,1);Circle2 C1(0.0,1,
28、1);cout”-program line- n”;cout”-program line- n”;return 0;return 0; 8.4 8.4 多重继承多重继承.1多重继承的声明多重继承的声明前面讨论的是单继承,即一个类是从一个基类派生而来的。在前面讨论的是单继承,即一个类是从一个基类派生而来的。在C+中还允许从多个基类中派生出新的子类,这种派生方法称中还允许从多个基类中派生出新的子类,这种派生方法称为多重继承或多基派生)。这一强大的派生功能可以大大提为多重继承或多基派生)。这一强大的派生功能可以大大提高软件重用的灵活性高软件重用的灵活性 。 声明的格式如下:声明的格式
29、如下: class class 派生类名派生类名 : : 派生存取说明符可省派生存取说明符可省1 1 基类名基类名1,1, 派生存取说明符派生存取说明符N N 基类名基类名N N /派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数;【例【例8.7】 多重继承的声明多重继承的声明#include class Circle1 /基类基类Circle1 protected: int r; public:void setx (int x) r=x;void draw( ) coutdrawingn;class Circle2 /基类基类Circle2 protected: int r; p
30、ublic:void setx (int x) r=x;void write( ) coutwritingn;class Circle: public Circle1,public Circle2 /类类Circle公有继承了公有继承了Circle1和和Circle2 public: void show() coutshowingn;void main() Circle cc;cc.draw();cc.write();cc.show();.2多重继承的几点说明多重继承的几点说明1. 1. 在多重继承中派生类成员的访问控制规则与单一继承规则相同。在多重继承中派生类成员的访问控制规
31、则与单一继承规则相同。2. 2. 多重继承的构造函数与析构函数定义与单一继承相似,只是多重继承的构造函数与析构函数定义与单一继承相似,只是在构造函数定义时在构造函数定义时N N个基类的构造函数之间用逗号分隔。个基类的构造函数之间用逗号分隔。3. 3. 多重继承虽然功能强大,但也容易造成系统的复杂性,设计多重继承虽然功能强大,但也容易造成系统的复杂性,设计时务必正确和谨慎,能用单一继承时尽量不用多重继承。时务必正确和谨慎,能用单一继承时尽量不用多重继承。4. 4. 多重继承容易产生模糊性,在引用时要注意多重继承容易产生模糊性,在引用时要注意 例如前面例例如前面例8.78.7如果按照下面来引用:如
32、果按照下面来引用: void main()void main() Circle cc; Circle cc;cc.setx(10); / Circle1cc.setx(10); / Circle1的的setxsetx还是还是Circle2Circle2的的setxsetx? void main()void main() Circle cc; Circle cc;cc.Circle1:setx(10); /cc.Circle1:setx(10); /说明是说明是Circle1Circle1中的中的r r为为1010 8.4.3 8.4.3 虚基类虚基类 1. 1. 虚基类的概念虚基类的概念在很多
33、情况下,程序员会定义一些类,而不想将其实例化在很多情况下,程序员会定义一些类,而不想将其实例化为任何对象,这样的类称为为任何对象,这样的类称为“虚类或虚类或“抽象类抽象类”,因为这种虚类,因为这种虚类一般都要被用作基类,所以又被称为一般都要被用作基类,所以又被称为“虚基类或虚基类或“抽象基类抽象基类”。 2. 2. 虚基类的声明虚基类的声明class 派生类名派生类名 : virtual 派生存取说明符可省)派生存取说明符可省) 虚基类名虚基类名/派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数;3. 3. 虚基类的初始化虚基类的初始化 虚基类初始化时,构造函数的调用顺序规则:虚基
34、类初始化时,构造函数的调用顺序规则:(1 1同一层派生中包含多个虚基类时,虚基类的构造函数按它们同一层派生中包含多个虚基类时,虚基类的构造函数按它们派生时声明的先后次序调用。派生时声明的先后次序调用。 (2 2如某虚基类是由实基类派生而来,则先调用此实基类的构如某虚基类是由实基类派生而来,则先调用此实基类的构造函数,再调用虚基类的构造函数,最后才是派生类的构造函数。造函数,再调用虚基类的构造函数,最后才是派生类的构造函数。 ( 3 3若同一层派生中,同时存在虚基类与实基类,应先调用虚基类的若同一层派生中,同时存在虚基类与实基类,应先调用虚基类的构造函数,再调用实基类的构造函数,最后调用派生类的
35、构造函数。构造函数,再调用实基类的构造函数,最后调用派生类的构造函数。 4. 4. 虚基类的作用虚基类的作用虚基类的作用就是为其他类提供一个合适的基类,以便虚基类的作用就是为其他类提供一个合适的基类,以便派生类可以从它那里继承和实现所需的接口。在多重继承时,派生类可以从它那里继承和实现所需的接口。在多重继承时,当派生类的多个基类有一个共同的基类时,为防止产生二义当派生类的多个基类有一个共同的基类时,为防止产生二义性问题可使用虚基类方法。性问题可使用虚基类方法。留意留意: : 虚基类并不是在声明基类时声明的,而是在声明虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为
36、一个基类可以派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。类时不作为虚基类。【例【例8.11】存在二义性的虚基类多重派生】存在二义性的虚基类多重派生#include class Base /基类基类protected: int b;public:Base()b =1;cout” Constructing Base class”endl;class Base1:public Base /基类基类1从从Base派派生生public:Base1()cout” Constructing Base1 class”endl;cout”Base b=”bendl;class Base2:public Base /基类基类2从从Base派生派生public:Base2()cout” Constructing Base2 class”endl;cout”Base b=”bendl;class Derived: public Base1, Base2 /从两个基类从两个基类base1和和b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年单位司机后勤人员考试试题及答案
- 脊椎压缩骨折课件
- 注浆工程施工计划方案(3篇)
- 东莞角落造景方案工程(3篇)
- 锅炉消防知识培训课件
- 2025年钻孔玻璃方面试卷及答案
- 深度解读2025年:区块链助力元宇宙建设的技术应用全景报告
- 2025年冲压车间技术员考试试题及答案
- 公司工程部企划方案(3篇)
- 车间安全培训互动游戏课件
- 八纲辨证-课件
- 突发事件处理记录表(标准范本)
- 房产归属协议书范本
- 学生休学申请表(新)
- 350吨履带吊地基承载力验算
- 影视艺术导论教材课件汇总完整版ppt全套课件最全教学教程整本书电子教案全书教案课件合集
- TSG-R0005-2022《移动式压力容器安全技术监察规程》(2022版)
- 2020 ACLS-PC-SA课前自我测试试题及答案
- 第1章 税务会计与纳税筹划概述
- GB∕T 41181-2021 坐姿椅
- 傅里叶级数及其应用论文
评论
0/150
提交评论