1、这样派生类中的其它成员函数均无权访问它,外界不可能通过派生新类来达到访问基类私有成员的目的。4 派生类构造函数和析构函数的执行顺序是怎样的?在多继承中,派生类构造函数和析构函数的执行顺序又是怎样的?构造函数的执行顺序:先祖先(基类)、再客人(对象成员),后自己(派生类本身)。析构函数的执行顺序和构造函数正好严格相反:先自己(派生类本身),再客人(对象成员),后祖先(基类)。 在多个基类之间严格按照派生类定义时从左到右的顺序来排列先后。而析构函数的调用顺序刚好与构造函数的相反。5 派生类的构造函数和析构函数的作用是什么?在下面两种情况下,必须定义派生类的构造函数:派生类本身需要构造函数;在定义派
2、生类对象时,其相应的基类对象需调用带有参数的构造函数。派生类对象的初始化也是通过派生类的构造函数实现的。具体来说,就是对该类的数据成员赋初值。派生类析构函数的功能与没有继承关系的类中析构函数的功能一样,也是在对象消亡之前进行一些必要的清理工作。6 多继承一般应用在哪些场合?对于多重继承,派生类可以有多个直接基类。这时的派生类同时得到了多个已有类的特征。7 在类的派生中为何引入虚基类?在含有虚基类的派生类中,当创建它的对象时,构造函数的执行顺序如何?当在多条继承路径上有一个公共的基类,在这些路径中的某几条路径汇合处,这个公共的基类就会产生多个实例(或多个副本),若想只保存这个基类的一个实例,可以
3、将这个公共基类说明为虚基类。从基类派生新类时,使用关键字virtual可以将基类说明成虚基类。在多个基类之间严格按照派生类定义时从左到右的顺序来排列先后。如果基类中有虚基类,则构造函数的调用顺序采用下列规则:(1) 虚基类的构造函数在非虚基类之前调用。(2) 若同一层次中包含多个虚基类,这些虚基类的构造函数按照他们说明的次序调用;(3) 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。特别需要注意,当一个派生类同时有多个基类时,对于所有需要给予参数进行初始化的基类,都要显式给出基类名和参数表。对于使用默认构造函数的基类,可以不给出类名。同样,对于对象成员,如果是使
4、用默认构造函数,也不需要写出对象名和参数表。而对于单继承,就只需要写一个基类名就可以了。8 设计一个大学的类系统,学校中有学生、教师、职员,每种人员都有自己的特性,他们之间又有相同的地方。利用继承机制定义这个系统中的各个类及类上必须的操作。参考程序:#include string.hclass Personprotected: char m_strName10; int m_nSex; int m_nAge;public: Person(char *name,int age,char sex) strcpy(m_strName, name); m_nSex= (sex=m?0:1 ); m_n
5、Age = age; void setName(char *name) void setSex(int sex) void setAge(int age) char * getName() return m_strName; int getAge() return m_nAge; int getSex() return m_nSex; void ShowMe() cout 姓 名:m_strNameendl; 性 别:(m_nSex=0?男:女) 年 龄:m_nAge;class Teacher : public Person char m_strDept20; int m_fSalary;
6、Teacher(char *name,int age,char sex,char *dept,int salary) :Person(name,age,sex) strcpy(m_strDept, dept); m_fSalary = salary; void ShowMe() Person:ShowMe(); 工作单位:m_strDept 月 薪:m_fSalary void setSalary(int salary) m_fSalary = salary; int getSalary() return m_fSalary;class Student : char m_strID12; ch
7、ar m_strClass12; Student(char *name,int age,char sex,char *ID,char *Class) strcpy(m_strID, ID); strcpy(m_strClass, Class); 学 号:m_strID 班 级:m_strClassn; void setID(char * ID) void setClass(char *Class) char* getID() return m_strID; char* getClass() return m_strClass;class Employee:public Person Emplo
8、yee(char *name,int age,char sex,int salary) 工 资:void main() / 定义三个不同类的对象 Teacher teacher1(刘馨,38,计算机系,3800); Student std1(刘丽,20,f计算机03); Employee emPloyee1(张鑫,25,1500); /显示各类人员的属性 teacher1.ShowMe(); cout- std1.ShowMe(); emPloyee1.ShowMe(); /修改各类人员的属性 teacher1.setAge(40); teacher1.setSalary(4500); std
9、1.setAge(21); emPloyee1.setAge(26); emPloyee1.setSalary(2000);修改各类人员的属性后:程序的执行结果为:姓 名:刘馨男38计算机系3800-刘丽女20计算机03张鑫251500404500212620009. 假定车可分为货车和客车,客车又可分为轿车、面包车和公共汽车。请设计相应的类层次结构。可以把轿车、面包车和公共汽车定义为客车类的对象#includeusing namespace std;class vehicle / 定义基类vehicle / 公有函数成员 vehicle(int in_wheels,float in_weig
10、ht); / 给数据成员初始化 int get_wheels(); / 获取车轮数 float get_weight(); / 获取汽车重量 void setWeels(int wls); void setWeight(float wt); void display()车轮数:wheels 汽车重量:weightprivate: / 私有数据成员 int wheels; / 车轮数 float weight; / 表示汽车承重vehicle:vehicle(int in_wheels,float in_weight) wheels = in_wheels; weight = in_weight
11、;float vehicle:get_weight() return weight;int vehicle:get_wheels() return wheels;void vehicle:setWeels(int wls) wheels = wls;setWeight(float wt) weight = wt;class truck:public vehicle / 定义货车类truck / 新增私有数据成员 float weight_load; / 承重 / 新增公有成员函数 truck(int wheel,float wt,float wl):vehicle(wheel,wt) weig
12、ht_load = wl; float getLoads() return weight_load; vehicle:display();汽车承重weight_load/车和客车,客车又可分为轿车、面包车和公共汽车class car:public vehicle / 定义客车类car int passenger_load; / 新增私有数据成员,表示载客数 / 新增公有成员函数 car(int in_wheels,float in_weight,int people=4):vehicle(in_wheels,in_weight) passenger_load = people; int get
13、Passengers() return passenger_load; void setPassengers(int people)载客数:passenger_load truck truck1(8,400,); / 货车 car car1(4,20); / 客车 car saloon_car(4,10,5); / 轿车 car microbus(6,10,18); / 面包车 car bus(6,20,30); / 公共汽车 / 显示相关信息 truck1.display();- car1.display(); saloon_car.display(); microbus.display()
14、; bus.display();程序的运行结果:8 汽车重量:400汽车承重-4 汽车重量:41056 汽车重量:183010.设计一个能细分为矩形、三角形、圆形和椭圆形的“图形”类。使用继承将这些图形分类,找出能作为基类部分的共同特征(如宽、高、中心点等)和方法(如初始化、求面积等),并看看这些图形是否能进一步划分为子类。class Figure / 定义基类图形类 Figure(int wid)width = wid; float area() int getWidth()return width; int width; / 宽度或半径class Rectangle:public Figu
15、re / 定义矩形类 int height; Rectangle(int wid, int hei):Figure(wid) height = hei; float area()return getWidth() * height;class Triangle:public Figure / 定义三角形类 int height; Triangle(int wid, int hei): float area()return 1.0/2* getWidth() * height;class Circle:public Figure / 定义圆类 Circle(int wid): float are
16、a()return 3.14 * getWidth() * getWidth(); Rectangle rect(5,4); Triangle tri(5,4); Circle cir(5);矩形的面积是:rect.area()endl 三角形的面积是:tri.area()圆的面积是:cir.area()程序的运行结果为:78.511.考虑大学的学生情况,试利用单继承来实现学生和毕业生两个类,设计相关的数据成员及函数,编程对继承情况进行测试。class Student / 定义基类vehicle Student(int n,char *na,int g):number(n),grade(g)
17、strcpy(name,na); int getNumber() return number; return name; int getGrade() return grade;学号:number姓名:name年级:grade int number; / 学号 char name20; / 姓名 int grade; / 年级class Graduate:public Student /定义毕业生类 char designSubject20; Graduate(int n,char *na,char * deSub,int g=4):Student(n,na,g) strcpy(designS
18、ubject,deSub); Student:设计题目:designSubject /创建对象 Student li(2,Li Ming,3); Graduate zhang(3,Zhang Gang学生成绩管理系统 / 显示对象的相关信息 li.display(); cout endl- zhang.display();2Li Ming3-Zhang Gang学生成绩管理系统12. 定义一个哺乳动物类,再由此派生出人类、狗类和猫类,这些类中均有speak()函数,观察在调用过程中,到底使用了谁的speak()函数。class Animal void speak() void setWeight(float wt)weight = wt; float getWeight()return wei
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1