C++面向对象程序设计习题 继承与派生
C++面向对象程序设计第8章 继承与派生习题解答

第8章习题一、概念题1.解答要点如下。
⑴采用public公有派生,基类成员的访问权限在派生类中保持不变,即基类所有的公有或保护成员在派生类中仍为公有或保护成员。
public派生最常用,可以在派生类的成员函数中访问基类的非私有成员,可通过派生类的对象直接访问基类的公有成员。
⑵采用private私有派生,基类所有的公有和保护成员在派生类中都成为私有成员,只允许在派生类的成员函数中访问基类的非私有成员。
private派生很少使用。
⑶采用protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,只允许在派生类的成员函数和该派生类的派生类的成员函数中访问基类的非私有成员。
2.解答要点如下。
派生类构造函数的执行次序:首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行;其次,调用内嵌对象构造函数,调用次序为各个对象在派生类内声明的顺序;最后,执行派生类构造函数体中的内容。
派生类析构函数执行过程与构造函数执行过程相反。
即当派生类对象的生存期结束时,首先调用派生类的析构函数,然后调用内嵌对象的析构函数,再调用基类的析构函数。
3.解答要点如下。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象。
二、填空题1.派生类基类2.public、protected、private3.virtual4.基类派生类自身5.成员函数三、编程题1.#include<iostream.h>#include<string.h>#include<iomanip.h>class base //定义一个基类{protected:char name[20]; //姓名char sex[3]; //性别int age; //年龄…};class teacher:public base //基类派生出教师类{ int sno; //工号char zc[20]; //职称double wages; //工资…};class student :public base //基类派生出学生类{ int sno; //学号char bj[10]; //班级char zy[10]; //专业double score; //入学成绩…};2.class Shape{public:virtual float area()=0;};float total(Shape *s[],int n){float sum=0.0;for(int i=0;i<n;i++)sum+=s[i]->area();return sum;}class Triangle:public Shape{public:Triangle(double h,double w){H=h;W=w;}double area() const{return H*W*0.5;}private:double H,W;};class Rectangle:public Shape{public:Rectangle(double h,double w){H=h;W=w;}double area()const{return H*W;}private:double H,W;};3.#include<iostream.h>class Vehicle{protected:int wheels;double weight;public:void initialize(int whls, double wght);int get_wheels() { return wheels; }double get_weight() { return weight; }double wheel_loading() { return weight/wheels; }};class Car:public Vehicle{private:int passenger_load;public:void initialize(int whls, double wght, int people =4);int passengers() { return passenger_load; }};class Truck: public Vehicle{private:int passenger_load;double payload;public:void init_truck(int number =2, double max_load =24000.0);double efficiency();int passengers() { return passenger_load; }};void Vehicle::initialize(int whls, double wght){wheels=whls;weight=wght;}void Car::initialize(int whls, double wght, int people){wheels=whls;weight=wght;passenger_load=people;}void Truck::init_truck(int number, double max_load){passenger_load=number;payload=max_load;}double Truck::efficiency(){return payload/(payload+weight);}void main(){Vehicle bicycle;bicycle.initialize(2,25);cout<<"the bicycle has "<<bicycle.get_wheels()<<" wheels.\n";cout<<"the bicycle weighs "<<bicycle.get_weight()<<" pounds.\n";cout<<"the bicycle's wheel loading is "<<bicycle.wheel_loading()<<" pounds per tire.\n\n";Car audi;audi.initialize(4,3500.0,5);cout<<"the audi has "<<audi.get_wheels()<<" wheels.\n";cout<<"the audi weighs "<<audi.get_weight()<<" pounds.\n";cout<<"the audi's wheel loading is "<<audi.wheel_loading()<<" pounds per tire.\n\n";Truck jief;jief.initialize(18,12500.0);jief.init_truck(2,33675.0);cout<<"the jief has "<<jief.get_wheels()<<" wheels.\n";cout<<"the jief weighs "<<jief.get_weight()<<" pounds.\n";cout<<"the jief's efficiency is "<<100.0*jief.efficiency()<<" percent.\n";}。
C++程序设计与应用基础第四章继承与派生习题答案

第四章继承与派生1、填空题1)在派生类中使用基类的成员,可以显示地使用___成员名限定符__来使用基类成员。
2)垂直访问时,保护成员的访问控制权限与____公有_____成员相同3)指向基类的对象的指针变量也可以指向___派生类____的对象。
4)若类Y是类X的私有派生类,类Z是类Y的派生类,则类Z__不能___访问类X的保护成员与公有成员。
5)在划线处填上适当的语句,完成下列程序。
#include <math.h>class Point{public:point(double a,double b,double c){___X=a;Y=b;Z=c;___}double Getx(){return X;}double Gety(){return Y;}double Getz(){return Z;}private:______double X;______protected:_____double Y,Z;_____};class Line :_____public______Point{public:Line(double a ,double b,double c,double d)_____:point(a,b,c)__{_ k=d;_ }void show(){cout<<Getx()<<endl;cout<<Gety()<<““<<.<<<endl;cout<<Getz()<<““<<Z<<endl;cout<<K<<endl;}private:double k;};void main(){Line obj(1.2,3.4,5.6,7.8);obj.show();}6)设置虚基类的目的是__解决二义性问题___,可通过___关键字virtual__标识虚基类。
2.2 继承和派生类 (第二章 C++面向对象程序设计)

20、派生类是如何定义的?答:class classname:access-label base-class这里access-label是public、protected或private,base-class是已定义的类的名字。
21、派生类的继承方式有哪些?它们各有哪些特点?答:继承方式有public继承、protected继承、private继承。
1)公有继承:基类公有成员相当于派生类的公有成员;基类保护成员相当于派生类的保护成员;基类的私有成员,派生类内部成员无法直接访问。
2)私有继承:基类公有成员和保护成员都相当于派生类的私有成员,派生类只能通过自身的成员函数访问它们;基类的私有成员,无论派生类内部成员或派生类的对象都无法直接。
3)保护继承:基类公有成员和保护成员都相当于派生类的保护成员,派生类可以通过自身的成员函数或其子类的成员函数访问它们;基类的私有成员,无论派生类内部成员或派生类的对象都无法直接访问22、在定义派生类的过程中,如何对基类的数据成员进行初始化?答:调用基类的初始化函数,或者如果有权限直接访问该数据成员,那就直接赋值初始化。
23、在派生类中能否直接访问基类中的私有成员?在派生类中如何实现访问基类中的私有成员?答:不能。
为了实现访问基类的私有成员,可以(1)在类定义体中增加保护段(protected);(2)将需访问基类私有成员的派生类成员函数声明为基类的友元。
24、什么是虚基类?它的作用如何?答:在派生类继承基类时,加上一个virtual关键词则为虚基类继承,如:class derive : virtual public base{ };作用:当某类的部分或全部直接基类是从另一个基类共同派生而来时,这直接基类中,从上一级基类继承来的成员就拥有相同的名称,派生类的对象的这些同名成员在内存中同时拥有多个拷贝,同一个函数名有多个映射。
可以使用作用域分辨符来唯一标识并分别访问它们。
C 第八章继承与派生习题习题解答

第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.6 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.2简答题(以下习题题号可能和教材不一致!)8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。
派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。
2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。
3.派生类的构造函数体中的操作。
8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。
继承与派生习题

C++讲义-第九章习题一.选择题1.下列对派生类的描述中,错误的是()A.一个派生类可以作为另一个派生类的基类。
B.派生类至少有一个基类。
C.派生类的成员除了它自己的成员之外,还包含了它的基类的成员。
D.派生类中继承的基类成员的访问权限到派生类保持不变。
2.派生类的对象对它的基类成员中,可以访问的是()A.公有继承的公有成员。
B.公有继承的私有成员。
C.公有继承的保护成员。
D.私有继承的公有成员。
3.对基类和派生类的关系描述中,错误的是()A.派生类是基类的具体化。
B.派生类是基类的子集。
C.派生类是基类定义的延续。
D.派生类是基类的组合。
4.派生类的构造函数的成员初始化列表中,不能包含的是()A.基类的构造函数。
B.派生类中子对象的初始化。
C.基类的子对象初始化。
D.派生类中一般数据成员的初始化。
5.关于子类型的描述中,错误的是()A.子类型就是指派生类是基类的子类型。
B.一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型。
C.在公有继承下,派生类是基类的子类型。
D.子类型关系是不可逆的。
6.关于多继承二义性的描述中,错误的是()A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。
B.解决二义性的常用方法是对成员名进行类名限定。
C.基类和派生类中同时出现的同名函数,也存在二义性问题。
D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性。
7.设置虚基类的目的是()A.简化程序B.消除二义性C.提高运行效率D.减少目标代码8.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化的次数为()A.与虚基类下面的派生类个数有关。
B.多次C.二次D.一次9.C++中的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过(),派生出新的类。
C++面向对象程序设计 第5章 继承与派生

私有派生
私有派生, 私有派生,派生类中基类公有和保护成员成为私有
class ClassName: private BaseClassName 私有派生时,基类中公有成员和保护成员在派生类中均变为私有的, 私有派生时,基类中公有成员和保护成员在派生类中均变为私有的, 在派生类中仍可直接使用这些成员,基类中的私有成员, 在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类 中不可直接使用。 中不可直接使用。 基类成员属性 公有 保护 私有 派生类 可以引用 可以引用 不可引用 派生类外 不可引用 不可引用 不可引用
中所谓“ 在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新 中所谓 继承” 的类。已存在的类称为“基类 或 父类(father class)”。 。 的类。已存在的类称为“基类(base class)”或“父类 新建立的类称为“派生类 新建立的类称为“派生类(derived class)”或“子类 或 子类(son class)”。 。
A为私有派生 为私有派生
但派生并不是简单的扩充,有可能改变基类的性质。 但派生并不是简单的扩充,有可能改变基类的性质。 有三种派生方式:公有派生、保护派生、私有派生。 有三种派生方式:公有派生、保护派生、私有派生。 默认的是私有派生。 默认的是私有派生。
从一个基类派生一个类的一般格式为: 从一个基类派生一个类的一般格式为: class ClassName:<Access>BaseClassName { 派生类名 private: ......; ; public: ......; ; ......; ; } //公有成员说明 公有成员说明 //保护成员说明 保护成员说明 //私有成员说明 私有成员说明 继承方式 基类名
C++(练习)第8章,继承与派生

C++(练习)第8章,继承与派生一,单选题1.下列描述中错误的是( )。
A 继承分为多重继承和单继承B 对象间通信靠传递消息实现C 在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征D 类是具有共同属性、共同方法的对象的集合参考答案C2. 设有以下定义:#includeclass A1{public:void show1() { cout<<"class A1"<<="">};class A2: public A1{public:void show2( ) { cout<<"class A2"<<="">};class A3: protected A2{public:void show3( ) { cout<<"class A3"<<="">};void main(){A1 obj1;A2 obj2;A3 obj3;...}以下不合法的调用语句是( )。
A obj1.show1();B obj2.show1();C obj3.show1();D obj2.show2();参考答案C3. 下列描述中哪个是正确的__________。
A 私有派生的子类无法访问父类的成员B 类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的C 私有派生类不能作为基类派生子类D 私有派生类的所有子孙类将无法继续继承该类的成员参考答案B4. 下面有关派生类的说法中,错误的是( )。
A 一个派生类可以作为另一个派生类的基类B 一个派生类可以有多个基类C 派生类构造函数可以将初始化参数值传递给基类的构造函数和对象成员的构造函数D 具有继承关系时,基类成员在派生类中的访问权限不变参考答案D5. 设置虚基类的目的是( )。
第3章-继承和派生习题

《面向对象程序设计》习题班级:__________ 学号: ________ 姓名: _________ 名单序号:_______ 成绩:________第3章继承与派生一、选择题(共28分,每题1分)1 •下列对派生类的描述中,()是错误的。
A • 一个派生类可以作为另一个派生类的基类B •派生类至少有一个基类C •派生类的成员除了它自己的成员外,还包含了它的基类成员D •派生类中继承的基类成员的访问权限到派生类保持不变2•派生类的对象对它的哪一类基类成员是可以访问的?()A •公有继承的基类的公有成员 B.公有继承的基类的保护成员C.公有继承的基类的私有成员D.保护继承的基类的公有成员3 •关于多继承二义性的描述,()是错误的。
A •派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B •一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C •解决二义性最常用的方法是作用域运算符对成员进行限定D •派生类和它的基类中出现同名函数时,将可能出现二义性4 •多继承派生类构造函数构造对象时,()被最先调用。
A •派生类自己的构造函数B•虚基类的构造函数C•非虚基类的构造函数 D •派生类中子对象类的构造函数5 • C++类体系中,能被派生类继承的是()。
A. 构造函数B.虚函数C •析构函数 D •友元函数6 •设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员()A. 私有继承B.保护继承C.公有继承D.私有、保护、公有均可7 • C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
A. 复用B.继承C.封装D.引用&继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
C++面向对象程序设计习题 继承与派生

继承与派生练习题1.什么是继承性?为什么说它是面向对象程序中的重要机制?2.C++中继承分为哪两个类?继承方式又分哪三种?3.三中继承方式中有哪些特点?不同基础更方式中派生类的对象对基类成员的访问有何不同?4.如何定义单继承的派生类?如何定义多继承的派生类?5.派生类与基类之间有什么关系?6.单继承中,派生类的构造函数定义格式如何?7.多继承中,派生类的构造函数定义格式如何?8.多继承中,在哪些情况下会出现二义性?如何消除二义性?9.为什么要引入虚基类?带有虚基类的派生类的构造函数有什么特点?作业题一、选择填空1.下列对派生类的描述中,(D )是错的。
A.一个派生类可以作另一个派生类的基类;B.派生类至少有一个基类;C.派生类的成员除了它自己的成员外,还包含了它的基类的成员;D.派生类中继承的基类成员的访问权限到派生类保持不变。
2.派生类的对象对它的基类成员中(A )是可以访问的。
A.公有继承的公有成员;B.公有继承的私有成员;C.公有继承的保护成员;D.私有继承的公有成员。
3.派生类的构造函数的成员初始化列表中,不能包含(D )。
A.基类的构造函数;B.派生类中对象成员的初始化;C.基类的对象成员的初始化;D.派生类中一般数据成员的初始化。
4.关于多继承二义性的描述中,(C)是错的。
A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性;B.解决二义性的最常用的方法是对成员名的限定义;C.基类和派生类中同时出现的同名函数,也存在二义性问题;(调用时才会出现二义性)D.一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性。
7.设置虚基类的目的是(B )A.简化程序;B.消除二义性;C.提高运行效率;D.减少目标代码。
8.带有虚基类的多层派生类构造函数的成员初始化列表中虚基类的构造函数将被初始化(D)A.类下面的派生类个数有关;B.二次;C.二次;D.一次。
《面向对象程序设计》习题四答案

面向对象程序设计习题4
(3) 下列程序中,基类base和派生类d1、d2中都含有私有、 保护和公有成员,d1类是base的派生类,d2是d1问属性的变化
面向对象程序设计习题4 #include <iostream.h> #include <iostream.h> class base class base {{private: int n1; private: int n1; protected: int k1; protected: int k1; public: public: base(){n1=0;k1=1;} base(){n1=0;k1=1;} void fun1(){cout<<n1<<k1<<endl;} }; void fun1(){cout<<n1<<k1<<endl;} }; class d1:public base class d1:public base {{ int n2; int n2; protected: protected: int k2; int k2; public: public: d1(){n2=10;k2=11;} d1(){n2=10;k2=11;} void fun2(){cout<<n1<<k1<<endl; cout<<n2<<k2<<endl;} }; void fun2(){cout<<n1<<k1<<endl; cout<<n2<<k2<<endl;} }; class d2:public d1 class d2:public d1 {{ int n3; int n3; protected: protected: int k3; int k3; public: public: d2(){n3=20;k3=21;} d2(){n3=20;k3=21;} void fun3() void fun3()
C++面向对象程序设计第八章继承与派生

13
8.4
派生类的构造函数与析构函数
在产生新的对象时, 都会调用相应的构造函数。 构造函数的作用有两点: (1)为成员变量分配存储空间。 (2)初始化成员变量的值。 派生类的构造函数? 析构函数? 基类的构造函数和析构函数是不能被继承的!
14
8.4.1简单派生类的构造函数
25
8.7继承与组合
在实际的程序开发过程中,使用面向对象的方 法,在建立新类的时候,要弄清新类与已有类 之间的关系 看究竟是 看究竟是ISA关系还是HASA关系? 关系还是 关系? 如果是ISA关系,就要通过继承来产生新的类 如果是HASA关系,就要通过组合来产生新的类
【例8.14】继承与组合示例 】
21
8.5.3多重继承的问题 【例8.10】 多重继承的问题 】
解决的办法之一:在处理变量时通过 基类名加上域作用符的方式 指明要操作的究竟是哪个变量 这样即不符合现实,还浪费了存储空间 解决的办法之二: 采用 虚基类
22
8.5.4虚基类
在继承时通过关键字virtual声明为虚继承, 相应的基类就成了虚基类。
6
8.2
派生类的声明方式及构成
比较这个定义和上一节中给出的undergraduate 定义,很容易发现继承的写法: 默认为private私 默认为 私
有继承 基类名1, 基类名2, class 子类名 : 继承方式 基类名 ,继承方式 基类名 , [继承方式] 父类名 …继承方式 基类名 继承方式 基类名n { 继承方式可以是 public(公有继承) (公有继承) 类的定义体 private(私有继承) (私有继承) protected(保护继承) (保护继承) };
C 面向对象程序设计习题解答(全)

4答案 n=2,sum=2 n=3,sum=5 n=5,sum=10
5答案 x=3 6答案 x=1,y=2 x=30,y=40 7答案 1 2 3 4 exit main 3 2 1 8答案 n=100 9答案 the student is:Li Hu the teacher is:Wang Ping 10答案 2 11答案 1035,789.504 12答案 13答案
一、选择题 1 2 3 4 D B B C
类和对象的进一步解析
5 D 6 D 7 D B 8 C B 9 10 11 12 13 14 15 16 B D B A A C B A
17 18 19 20 21 22 23 24 C C D B A D 二、填空题 1 this 2所有成员 3友元类、友元函数 4 friend 5 程序编译、程序结束 三、程序阅读题
第六章 派生与继承
一、选择题 1(1) 1(2) 2 A B 3 4 5 6 7 8 9 10 11 D C C C D D B C A D
二、填空题 1 继承 2 具体化、抽象 3 公有继承、保护继承、私有继承 4 子对象 5 public(共有的)、protected(保护的)、不可访问 6 protected(保护的)、protected(保护的)、不可访问的 7 private(私有的)、private(私有的)、不可访问的 8 二义性 三、判断下列描述的正确性 1 2 3 4 5 6 7 8 9 10 11 12 13 √ × × × × × √ √ × × √ √ ×
1、 选择题 1 2 3 4 5 6 7 C 8 9 10 D D D C A D C 2、 程序阅读题 1答案 a=639,b=78,c=12 2答案 a=5,b=8 a=8,b=5 3答案 10 4答案 x=20.6 y=5 z=A x=216.34 y=5 z=A x=216.34 y=2 z=A x=216.34 y=2 z=E 5答案 ic=11 fc=7.82 ic=5 fc=2.15 3、 判断下列描述的正确性 1 2 √ × D A
C++面向对象程序设计第8章 继承与派生

cout<<m_strName<<"\t"<<m_ nSex<<"\t"<<m_strDept<<"\n "; } };
蚌埠学院计算机系
12
C++面向对象程序设计
8.3
8.3.1 public派生
三种派生方式
以公有继承方式创建的派生类对基类各种成员的访问权限 如下: ⑴基类公有成员相当于派生类的公有成员,即派生类可以像 访问自身的公有成员一样访问基类的公有成员。
1c面向对象程序设计第八章继承和派生c面向对象程序设计蚌埠学院计算机系2学习目标理解继承与派生的概念掌握派生类的定义格式理解派生类成员的来源掌握三种不同继承方式对基类成员派生类成员访问权限的影响熟悉单一继承方式下派生类构造函数和析构函数的书写格式执行顺序了解多重继承方式下派生类构造函数和析构函数的书写格式执行顺序了解二义性问题产生的原因掌握虚基类的定义及应用c面向对象程序设计蚌埠学院计算机系381为什么要引入继承的概念?面向对象程序设计十分强调软件的可重用性其重要特征继承是软件复用的一种重要形式
蚌埠学院计算机系
19
C++面向对象程序设计
8.4
三种派生方式的区别
采用public公有派生,基类成员的访问权限在派生类中保 持不变,即基类所有的公有或保护成员在派生类中仍为公 有或保护成员。public派生最常用,可以在派生类的成员 函数中访问基类的非私有成员,可通过派生类的对象直接 访问基类的公有成员。 采用private私有派生,基类所有的公有和保护成员在派 生类中都成为私有成员,只允许在派生类的成员函数中访 问基类的非私有成员。private派生很少使用。 采用protected保护派生,基类所有的公有和保护成员在 派生类中都成为保护成员,只允许在派生类的成员函数和 该派生类的派生类的成员函数中访问基类的非私有成员。
C++继承和派生编程参考答案

继承和派生练习一1.以日期类cDate(有数据成员年月日)为基类派生日期时间类cTime,新增数据成员时分秒,要求有构造函数、输出所有成员的函数,测试程序正确性。
#include<iostream.h>class cDay{int ye,mo,da;public:cDay(int a=2000,int b=1,int c=1){ye=a,mo=b,da=c;}void Dout(void){cout<<ye<<' '<<mo<<' '<<da<<endl;}};class cTime:public cDay{int ho,mi,se;public:cTime(int a=2000,int b=1,int c=1,int d=12,int e=12,int f=12):cDay(a,b,c){ho=d,mi=e,se=f;}void Tout(void){Dout();cout<<ho<<' '<<mi<<' '<<se<<endl;}};void main(void){cTime t1(2010,4,30,15,20,23);t1.Tout();}2.以三维坐标类cPoint为基类派生圆类cCircle,新增数据成员半径;再以圆类为基类派生圆柱体类cColumn,新增数据成员高度,要求有构造函数、输出所有成员的函数,在相关类中定义求圆面积的成员函数、求体积的成员函数,测试程序正确性。
#include<iostream.h>#define PI 3.1415926class cPoint{float x,y,z;public:cPoint(float a=1,float b=1,float c=1){x=a,y=b,z=c;}void Pout(void){cout<<"x="<<x<<" y="<<y<<" z="<<z;}};class cCircle:public cPoint{float r;public:cCircle(float a=1,float b=1,float c=1,float d=2):cPoint(a,b,c){r=d;}float area(void){return PI*r*r;}void Cout(void){Pout();cout<<" r="<<r;}};class cColumn:public cCircle{float h;public:cColumn(float a=1,float b=1,float c=1,float d=2,float e=3):cCircle(a,b,c,d){ h=e;}float v(void){return area()*h;}void Coout(void){Cout();cout<<" h="<<h<<endl;}};void main(void){cCircle t1(1,2,3,4);t1.Cout();cout<<" area="<<t1.area()<<endl;cColumn t2(2,3,4,5,6);t2.Coout();cout<<"v="<<t2.v()<<endl;}。
最新《C++程序设计案例教程》习题答案第8章 类的继承与派生

第8章类的继承与派生一、选择题1.D 2.A 3.A 4.B 5.B 6.B二、程序题(略)三、简答题1.派生类对基类的继承方式有哪些?在派生类中,成员有几种不同的访问属性?答:派生类对基类的继承方式有三种:public、protected、private。
成员也有三种访问属性:public、protected、private。
2.多级派生的访问属性如何确定?答:多级派生的访问属性确定的原则与单层派生一致。
3. 在执行派生类时,如何调用基类的构造函数?答:在派生类构造函数的初始化列表中描述。
4. 对数据成员初始化时,如何对子对象初始化?答:在派生类构造函数的初始化列表中,写上子对象名(实际参数)。
5.程序中有多重继承时,系统如何调用析构函数?答:按照调用构造函数相反的顺序调用析构函数。
6.举例说明多重继承引起的二义性,如何解决此问题?多重继承指一个类从多个基类中派生而来。
如果一个派生类有多个直接基类,而这些直接基类又都派生于同一个基类,则在最终派生类中会保留间接基类中的多份数据成员,从而导致在派生类中访问这些数据成员时,可能产生错误,即二义性的错误。
C++提供了虚基类(virtual base class)的方法来解决这个问题,使得派生类在获得间接基类的数据成员时只保留一份拷贝。
7. 谈谈虚基类的作用。
在进行多重继承时,为保证最终派生类中只继承一次,通常声明该基类为所有直接派生类的虚基类。
如果虚基类中定义了带参数的构造函数,则在其所有的派生类(直接派生类或者间接派生类)中,必须通过这些派生类的构造函数对虚基类构造函数调用。
但是,其实只有最后的派生类成功地调用了虚基类的构造函数,并对虚基类的数据成员进行了初始化,其余派生类中对虚基类的调用只是形式,以形成派生类构造函数声明格式的一致性,而没有真正调用虚基类的构造函数。
这就保证了虚基类的数据成员不会被多次初始化。
四、编程题分别声明Teacher类和Cadre类,采用多重继承方式由这两个类派生出新类TC类。
c++程序设计类的继承和多态编程题

一、继承的意义和应用1. 继承是面向对象编程中的重要概念,它允许一个类继承另一个类的属性和方法。
2. 在C++程序设计中,继承可以减少代码重复,提高代码的复用性和可维护性。
3. 通过继承,子类可以扩展或修改父类的行为,实现代码的灵活性和可扩展性。
二、继承的语法和实现1. 在C++中,使用关键字“class”定义一个类,通过“:”符号实现继承。
2. 派生类可以继承基类的公有成员和保护成员,但不能继承基类的私有成员。
3. 在派生类中,可以通过作用域解析运算符“::”访问基类的成员。
三、多态的概念和特点1. 多态是面向对象编程中的重要特性,它允许不同类的对象对同一消息作出不同的响应。
2. 多态可以增加程序的灵活性和可扩展性,提高代码的可读性和可维护性。
3. C++中实现多态的方式包括虚函数、纯虚函数和函数重载。
四、C++中实现多态的方法1. 虚函数是实现多态的关键,通过在基类中声明虚函数,在派生类中重写虚函数实现多态。
2. 纯虚函数是一种特殊的虚函数,它没有具体的实现,只是一个接口,必须在派生类中实现。
3. 函数重载允许在同一个作用域中定义多个同名函数,根据参数的不同实现不同的行为,也可以实现多态效果。
五、继承和多态的应用场景1. 继承和多态在实际的软件开发中有着广泛的应用,例如在设计图形界面控件时,可以使用继承和多态实现不同控件的共性和个性.2. 在游戏开发中,通过继承和多态可以实现不同角色的行为和动作。
3. 在企业应用中,可以通过继承和多态实现不同部门或员工的管理和操作。
六、C++程序设计中的继承和多态案例分析1. 通过一个实际的案例,演示如何使用C++实现继承和多态。
2. 分析案例中的设计思路和代码实现,介绍继承和多态在程序设计中的作用和效果。
3. 总结案例中的经验和教训,为读者提供实践经验和指导。
七、总结1. 继承和多态是C++程序设计中的重要内容,它可以提高代码的复用性和可维护性,增加程序的灵活性和可扩展性。
《派生与继承》课后习题 (含答案)

A. 首先调用基类构造函数 A(),其次调用构造函数 B(),最后执行派生类的构造函数 C()的函数体。 B. 首先调用构造函数 B(),其次调用基类构造函数 A(),最后执行派生类的构造函数 C()的函数体。 C. 首先执行派生类的构造函数 C()的函数体, 其次调用构造函数 B(), 最后调用基类构 造函数 A()。 D. 首先执行派生类的构造函数 C()的函数体, 其次调用基类构造函数 A(), 最后调用构 造函数 B()。 14、一个基类以私有方式派生时,其基类中的公有成员和保护成员在派生类中 是 A A.均成为私有的成员 C.均成为保护的成员 15、实现多态的派生类函数不一定要是 B A.与基类虚函数同名 C.与基类虚函数同参数表 B.用 virtual 修饰 D.与基类虚函数同返回类型 a1,*pa=&a1;B b1,*pb=&b1;”,则正确的赋 B.均成为公有的成员 D.仍为公有的和保护的成员
《派生与继承》习题
学号 一、选择题
姓名
1、假设 Person 类包含公有成员 name,私有成员 id 和受保护成员 GetID,而 Student 类私 有继承了 Person 类,那么 Student 类的成员函数可以直接访问 A.Person 类的所有成员 B.仅有 Person 类的公有成员 name C.仅有 Person 类的公有成员 name 和受保护成员 GetID D.Person 类的任何成员都不能访问 2、实现多态的派生类函数不必 A.与基类虚函数同名 C.与基类虚函数同返回类型 D B.与基类虚函数同参数表 D.用 virtual 修饰 C 。
A
B.派生类和基类中允许出现同名的成员数据或成员函数 C.在派生类构造对象时,首先调用基类的构造函数 D.派生类无法没有继承基类的私有成员 19、下列有关继承和派生的叙述中,不正确的是 AB
C++习题第07章 继承和派生

A)使用虚基类的目的是消除多重继承下的二义性
B)虚基类中的子对象的初始化次数与该虚基类的派生类的个数有关
C)虚基类的多层派生类结构函数的成员初始化列表中都要列出对虚基类构造函数
的调用
(10)运行时的多态性上指()
A)用指向对象的基类指针或引用调用一个纯虚函数
(3)设计一个抽象类,并由它派生出圆柱体、球体和正方体3个类,实现计算圆柱体、球体和正方体表面积和体积;要求按照运行时多态性的方法设计主函数,进行测试。
习题参考答案
第1章
1
(1)函数说明,函数体
(2)声明区,主程序区,函数定义区
(3)多态性
(4)namespace,using
(5)std
(6)cin,>>
(j)3
(k)s1>='0'&&s1<='9'
(l)N!=0
3
(1)0,15
(2)(1、1、1),(-1、-1、-1)
(3)
(a)a*a+2*a*b+b*b
(b)4.0/3.0*3.1415926*R*R*R
(c)5.0/9.0*(F-32)
(d)b>=a&&b<=c
(4)
36
41
43
(5)
x=1
4
C)基类的子对象的初始化D)派生类的子对象的初始化
(5)若如下类声明:
ClassX
{int x;
Public:
X(int n){x=n;}
};
ClassY:publicX
{int y;
Public;
继承与派生类C试题

继承与派生类知识要点1.1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握priv ate,public,protec ted三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protec ted成员在派生类中作为private成员;对于公有继承,基类的pub lic、protec ted成员在派生类中访问属性不变;对于保护继承,基类的public、protec ted成员在派生类中作为protecte d成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
面向对象程序设计语言C++第06章 继承和派生

void main() { A objA; objA.set_priA(1); objA.set_pubA(2); objA.out_priA(); B objB; objB.set_priA(3); objB.set_pubA(4); objB.set_priB(5); objB.set_pubB(6); objB.out_priA(); objB.out_B(); } • 程序输出为: 13456
猿科
猫科
熊猫
野猫
家猫
动物分类层次图
4
第六章 继承和派生 •6.1派生类的概念
6.1.1为什么要使用继承 为什么要使用继承 在最简单的情况下,一个类B继承类A或者从类A 派生类B,通常将类A称为基类(父类),类B称为派 生类(子类)。 这时,类B的对象具有类A对象的所有特性,甚至 还会更多一些。 也可以这样说,类B从类A派生出来。这意味着类 B至少描述了与类A同样的接口,至少包含了同类A 一样的数据,可以共享类A的成员函数。
25
第六章 继承和派生 • 6.1派生类的概念
6.1.2 派生类的声明和继承方式 访问声明的形式为: (1)基类类名::基类保护段或公有段数据成员; (2)基类类名::基类保护段或公有段成员函数名;
class B { int a; public: public: int b; void f(); }; class D : private B { int d; public: public: B::b; B::f; int c; };
9
这种继承和派生机制对于已有程序的扩展 和改进是极为有力的。 可以描述基类和派生类的关系为: 派生类是基类的具体化, 基类是派生类的抽象。 即基类综合了派生类的公共特征,派生类 则在基类的基础上增加了某些特征,把抽象 类变成具体的、实用的类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
继承与派生练习题1.什么是继承性?为什么说它是面向对象程序中的重要机制?所谓继承,就是从先辈处得到属性和行为特征。
2.C++中继承分为哪两个类?继承方式又分哪三种?基类和派生类public(公有)、private(私有)和protected(保护)继承3.三中继承方式中有哪些特点?不同基础更方式中派生类的对象对基类成员的访问有何不同?(1) 公有继承(public)方式:基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,而基类的私有成员在派生类中不可访问。
(2) 保护继承(protected)方式:基类中的公有成员和保护成员在派生类中都变成保护成员,而基类的私有成员在派生类中不可访问。
(3) 私有继承(private)方式:基类中的公有成员和保护成员在派生类中都变成私有成员,而基类的私有成员在派生类中不可访问。
因此,无论哪种继承方式,基类中的私有成员在派生类中都不允许访问,基类中的公有成员和保护成员都可以被派生类中的成员直接访问。
派生类对象对基类成员的访问1. 保护继承在类定义中,在关键字protected下说明的成员称为保护成员。
保护成员既具有私有的特性又具有公有的特性。
2. 公有继承在公有继承方式下,基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象只能访问基类的公有成员,不能访问基类的保护成员和私有成员。
3. 私有继承在私有继承方式下,基类中的公有成员和保护成员在派生类中都变成私有成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象不能访问基类的任何成员。
4.如何定义单继承的派生类?如何定义多继承的派生类?一个派生类只有一个直接基类,则该继承称为单一继承一个派生类有多个直接基类,则该继承称为多重继承5.派生类与基类之间有什么关系?在面向对象程序设计中,继承就是一个新类可以从现有类获得特征,从现有类产生新类的过程就是类的派生。
现有的用来派生新类的类称为基类或父类,由现有类派生出来的新类称为派生类或子类。
6.单继承中,派生类的构造函数定义格式如何?在C++中,派生类构造函数的一般形式为:派生类名::派生类名(参数总表):基类名(参数表1),对象成员名1(参数表2),对象成员名2(参数表3),…{派生类新增成员的初始化语句}7.多继承中,派生类的构造函数定义格式如何?多重继承定义的一般形式如下:class 派生类名:继承方式1 基类名1,继承方式2 基类名2,…,继承方式n 基类名n {派生类新增加的数据成员和成员函数说明};多重继承派生类的构造函数多重继承派生类的构造函数的一般形式如下:派生类名::派生类名(参数总表):基类名1(参数表1),…,基类名n(参数表n),对象成员名1(对象参数表1),…,对象成员名m(对象参数表m){派生类新增成员的初始化语句}8.多继承中,在哪些情况下会出现二义性?如何消除二义性?在多重继承下,产生二义性的情况主要有以下两种。
1. 调用不同基类的同名成员时产生二义性在多重继承情况下,派生类有多个基类,如果这些基类中有同名的成员,则在派生类中和派生类的对象调用同名成员时,可能产生二义性2. 访问共同基类的成员时产生二义性当一个派生类有多个直接基类,而这些直接基类又有一个共同的基类时,对这个共同基类中成员的访问会出现二义性。
可以使用成员名限定方式,不过这时应该用其直接基类进行限定。
由于多重继承中存在二义性,因此,一个类不能从同一个类中直接继承一次以上。
9.为什么要引入虚基类?带有虚基类的派生类的构造函数有什么特点?在多重继承中,C++提供了虚基类来解决这种二义性问题。
虚基类不是一种新的类型的类,而是一种继承方式。
如果采用虚基类方式定义派生类,则在建立派生类的对象时,类层次结构中某个虚基类的成员只在内存中出现一次,即基类的一个实例被所有派生类的对象所共享。
C++规定,虚基类成员的初始化由最近派生类的构造函数调用虚基类的构造函数完成。
为了保证虚基类的构造函数由最近派生类的构造函数调用,所有由虚基类作为直接或间接基类的派生类的构造函数的成员初始化列表中必须包含对虚基类构造函数的调用。
如果没有列出对虚基类构造函数的调用,则虚基类中必须有缺省构造函数。
C++中又规定,在派生类构造函数的成员初始化列表中,出现的虚基类构造函数先于非虚基类构造函数的调用。
作业题一、选择填空1.下列对派生类的描述中,()是错的。
A.一个派生类可以作另一个派生类的基类;B.派生类至少有一个基类;C.派生类的成员除了它自己的成员外,还包含了它的基类的成员;D.派生类中继承的基类成员的访问权限到派生类保持不变。
2.派生类的对象对它的基类成员中()是可以访问的。
A.公有继承的公有成员;B.公有继承的私有成员;C.公有继承的保护成员;D.私有继承的公有成员。
3.派生类的构造函数的成员初始化列表中,不能包含()。
A.基类的构造函数;B.派生类中对象成员的初始化;C.基类的对象成员的初始化;D.派生类中一般数据成员的初始化。
4.关于多继承二义性的描述中,()是错的。
A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性;B.解决二义性的最常用的方法是对成员名的限定义;C.基类和派生类中同时出现的同名函数,也存在二义性问题;调用时才产生D.一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性。
7.设置虚基类的目的是()A.简化程序;B.消除二义性;C.提高运行效率;D.减少目标代码。
8.带有虚基类的多层派生类构造函数的成员初始化列表中虚基类的构造函数将被初始化()A.类下面的派生类个数有关;B.三次;C.二次;D.一次。
二、判断下列描述是否正确,对者划√,错者划×。
√1.C++语言中,既允许单继承,又允许多重继承。
×2.派生类是从基类派生出来,它不能再生成新的派生类。
×3.派生类的继承方式有两种:公有继承和私有继承。
×4.在公有继承中,基类中的公有成员和私有成员在派生类中都是可访问的。
√5.在公有继承中,基类中只有公有成员对派生类对象是可访问的。
×6.在私有继承中,基类中只有公有成员对派生类是可访问的。
√7.在私有继承中,基类中所有成员对派生类的对象都是不可访问的。
8.在保护中继承中,对于垂直访问同于公有继承,而对于水平访问同于私有继承。
√9.派生类是它的基类的组合。
×10.构造函数可以被继承,析构函数不能被继承。
√11.多继承情况下,派生类的构造函数的执行顺序取决于定义派生类时所指定的各基类的顺序。
×12.单继承情况下,派生类中对基类成员的访问也会出现二义性。
√13.解决多继承情况下出现的二义性的方法之一是使用成员名限定法。
三、分析下列程序输出的结果。
1.#include <iostream.h>class A{public:A(int i,int j){a=i;b=j;}void Move(int x,int y){a+=x;b+=y;}void Show(){cout<<"("<<a<<","<<b<<")"<<endl;}private:int a,b;};class B:private A{public:B(int i,int j,int k,int l):A(i,j){x=k;y=l;}void Show(){cout<<x<<","<<y<<endl;}void fun(){Move(3,5);}void f1(){A::Show();}private:int x,y;};void main(){A e(1,2);e.Show();B d(3,4,5,6);d.fun();d.Show();d.f1();}2.#include <iostream.h>class A{public:A(int i,int j){a=i;b=j;}void Move(int x,int y){a+=x;b+=y;}void Show(){cout<<"("<<a<<","<<b<<")"<<endl;} private:int a,b;};class B:private A{public:B(int i,int j,int k,int l):A(i,j),x(k),y(l){ }void Show(){cout<<x<<","<<y<<endl;}void fun(){Move(3,5);}void f1(){A::Show();}private:int x,y;};int main(){A e(1,2);e.Show();B d(3,4,5,6);d.fun();d.A::Show();d.B::Show();d.f1();}3.#include<iostream.h>class P{public:P( int p1,int p2) { pri1=p1;pri2=p2;}Int inc1() { return ++pri1;}int inc2() {return ++pri2;}void display() {cout<<”pri1=”<<pri1<<”,pri2=”<<pri2<<endl;}private:int pri1,pri2;};class D1:virtual private P{public:D1(int p1,int p2,int p3):P(p1,p2){ pri3=p3; }int inc1() {return P::inc1();}int inc3() {return ++pri3;}void display(){P::display();cout<<”pri3=”<<pri3<<endl;}private:int pri3;};class D2:virtual public P{public:D2(int p1,int p2,int p4):P(p1,p2){ pri4=p4; }int inc1(){P::inc1();P::inc2();return P::inc1();}int inc4() {return ++pri4;}void display(){P::display();cout<<”pri4=”<<pri4<<endl;}private:int pri4;};class D12:private D1,public D2{public:D12( int p11,intp12,intp13,intp21,intp22,intp23,int p):D1(p11,p12,p13,),D2(p21,p22,p23),p(p11,p21){pri2=p;}int inc1(){D2::inc1();return D2::inc1();}int inc5() {return ++pri12;}void display(){cout<,”D2:;display()\n”;D2:;display();cout<<pri12=”<<pri12<<endl;}private:int pri12;};void main(){D12 d(1,2,3,4,5,6,7);d.display();cout<<endl;d.inc1();d.inc4();d.inc5();d,D12::inc1();d.display();}。