C 第八章继承与派生习题习题解答
C++教程第08章 继承与派生-5-7

第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章 继承与派生继承是面向对象程序设计的一个重要特征之一,它允许在既有类的基础上创建新的类,新类可以从一个或多个既有类中继承操作和数据,而且可以重新定义或加进新的数据和操作,从而形成类的层次或等级。
继承与派生习题

一、选择填空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. 设有如下程序:#include<iostream.h>class A{ public: int i;display() { cout<<”class A\n”; }};class B{public: int i;display() { cout<<”cla ss B\n”; }};class C: public: A, public B{ int j;public:int i;show(){j=i*i; display();}};void main(){C demo;demo.show();}主程序运行时将( )A. 因变量i的重复定义而报错B. 因对象demo间接调用display函数时产生歧义性而报错C. 因类定义的语法错而不能运行D. 没有语法错,正常输出结果8 若要用派生类的对象访问基类的保护成员,以下观点正确的是( )A.不可能实现B.可采用保护继承C.可采用私有继承D.可采用公有继承二.填空题1.派生类可以定义其_______________中不具备的数据和操作。
c继承与派生习题答案

1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现—二
义性一。在派生类中采用_虚基类_或_作用域分辨符一来消除该问题。
3.选择题
3.1下面对派生类的描述中,错误的是(D)。
};
class MyDERIVED: protected MyBASE{ protected;
int j;
public:
void set(int m,int n){MyBASE::set(m);j=n;}
int get()const{return MyBASE::get( )+j;}
};
则类MyDERIVED中保护成员个数是(B)。
概念填空题
1.1在C++中,三种派生方式的说明符号为_public_、_private.、protected不加 说明,则默认的派生方式为private.。
1.2当公有派生时,基类的公有成员成为派生类的公有成员保护成员成为派
生类的_保护成员;私有成员成为派生类的—不能直接访问成员_。当保护派生时, 基类的公有成员成为派生类的—保护成员;保护成员成为派生类的—保护成员 私有成员成为派生类的—不能直接访问成员_。
A.—个派生类可以作为另外一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员
D.派生类中继承的基类成员的访问权限到派生类中保持不变
3.2下列对友元关系叙述正确的是(A)。
A.不能继承
B.是类与类的关系
C.是一个类的成员函数与另一个类的关系
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. 设置虚基类的目的是( )。
C语言课后习题答案第八章解析

作业八:函数程序设计答案{ double z; z 二x+y; return z; }(重要)3.以下正确的说法是A_°在C 语言中A)B) C) D)4.若调用一个函数,且此函数中没有return 语句,则正确的说法是D_。
没有返回值返回若干个系统默认值 能返回一个用户所希望的函数值 返回一个不确定的值(重要)5. 以下不正确的说法是B_° C 语言规定A) B)C) D)6. C 语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是隹^A) B) C) D)7.以下程序有语法性错误,有关错误原因的正确说法是C_。
main()(一)选择丿 (30分) 1.以下正确的函数定义形式是 A) B)C) D) double double double double fun (int x, int fun (int x;int fun (int x, intfun(int x, y);y) y) y); 2.以下正确的函数形式是D_。
A) B) C) D) double fun (int x, int { z 二x+y; return z; } fun (int x, y){ int z: return z; } fun (x, y){ int x,y; double z;double fun (int x, inty) z 二x+y; return z; } y)实参和与其对应的形参各占用独立的存储单元 实参和与其对应的形参共占用一个存储单元 只有当实参和与其对应的形参同名时才共占用存储单元 形参是虚拟的,不占用存储单元该函数A) B) C) D)实参可以是常量、变量或表达式 形参可以是常量、变量或表达式 实参可以为任意类型形参应与其对应的实参类型一致 地址传递 单向值传递山实参传给形参,再山形参传回给实参 由用户指定传递方式int G=5, k;void Prt.char ();k=Prt_char(G);}A)语句void prt.char ();有错,它是函数调用语句,不能用void 说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线8.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是A)float 型B)int 型C)long 型D)double 型9.C语言规定,函数返回值的类型是Lil D_oA)return语句中的表达式类型所决定B)调用该函数时的主调函数类型所决定C)调用该函数时系统临时决定D)在定义该函数时所指定的函数类型所决定10.下面函数调用语句含有实参的个数为」func((expl,exp2), (exp3,exp4,exp5));A) 1 B) 2 C) 4 D) 5 (重要)11.以下程序的功能是计算函数F(x, y, z)二(x+y)/(x-y) + (z+y)/(z-y)的值,请选择填空。
c++实验8 继承与派生上机练习题

1.定义一个哺乳动物类Mammal,并从中派生出一个狗类Dog,下面给出Mammal类的定义,要求:(1)添加Dog类的颜色数据成员,访问属性为私有,通过SetColor和GetColor成员函数来对颜色进行设置和获取。
(2)分别为基类和派生类添加相应的构造函数(有参、无参)和析构函数,并进行测试.class Mammal{protected:int itsAge;int itsWeight;public:int GetAge(){return itsAge;}void SetAge(int age) {itsAge=age;}int GetWeight() { return itsWeight;}void SetWeight(int weight) {itsWeight= weight;}};class Dog : public Mammal{//定义Dog类的数据成员和成员函数};改:#include 〈iostream。
h〉#include 〈string〉using namespace std;class Mammal{protected:int itsAge;int itsWeight;public:Mammal();~Mammal();int GetAge(){return itsAge;}void SetAge(int age) {itsAge=age;}int GetWeight() { return itsWeight;}void SetWeight(int weight) {itsWeight= weight;}};class Dog : public Mammal{protected:char itscolor[20];public:Dog();void Setcolor(char *color) {strcpy(itscolor,color);}void getcolor(){cout〈<"狗的颜色”<〈itscolor<〈endl;}//定义Dog类的数据成员和成员函数};////////////////////////Mammal::Mammal(){int age1,weight1;cout〈〈”请输入动物的年龄:"〈〈endl;cin>>age1;SetAge(age1);cout<〈”请输入动物的体重:”<〈endl;cin>>weight1;SetWeight(weight1);}Mammal::~Mammal(){cout〈〈"Destructor called。
程序设计教程(机械工业出版社)课后习题答案 第8章 继承――派生类

第8章继承――派生类1、在C++中,protected类成员访问控制有什么作用?答:C++中引进protected成员保护控制,缓解了数据封装与继承的矛盾。
在基类中声明为protected的成员可以被派生类使用,但不能被基类的实例用户使用,这样能够对修改基类的内部实现所造成的影响范围(只影响子类)进行控制。
protected成员保护控制的引进使得类有两种接口:与实例用户的接口和与派生类用户的接口。
2、在C++中,三种继承方式各有什么作用?答:类的继承方式决定了派生类的对象和派生类的派生类对基类成员的访问限制。
public继承方式使得基类的public成员可以被派生类的对象访问,它可以实现类之间的子类型关系;protected继承使得基类的public成员不能被派生类的对象访问,但可以被派生类的派生类访问;private继承使得基类的public成员既不能被派生类的对象访问,也不能被派生类的派生类访问。
protected和private继承主要用于实现上的继承,即纯粹为了代码复用。
3、在多继承中,什么情况下会出现二义性?怎样消除二义性?答:在多继承中会出现两个问题:名冲突和重复继承。
在多继承中,当多个基类中包含同名的成员时,它们在派生类中就会出现名冲突问题;在多继承中,如果直接基类有公共的基类,就会出现重复继承,这样,公共基类中的数据成员在多继承的派生类中就有多个拷贝。
在C++中,解决名冲突的方法是用基类名受限;解决重复继承问题的手段是采用虚基类。
4、写出下面程序的运行结果:#include <iostream>using namespace std;class A{ int m;public:A() { cout << "in A's default constructor\n"; }A(const A&) { cout << "in A's copy constructor\n"; }~A() { cout << "in A's destructor\n"; }};class B{ int x,y;public:B() { cout << "in B's default constructor\n"; }B(const B&) { cout << "in B's copy constructor\n"; }~B() { cout << "in B's destructor\n"; }};class C: public B{ int z;A a;public:C() { cout << "in C's default constructor\n"; }C(const C&) { cout << "in C's copy constructor\n"; }~C() { cout << "in C's destructor\n"; }};void func1(C x){ cout << "In func1\n";}void func2(C &x){ cout << "In func2\n";}int main(){ cout << "------Section 1------\n";C c;cout << "------Section 2------\n";func1(c);cout << "------Section 3------\n";func2(c);cout << "------Section 4------\n";return 0;}答:------Section 1------in B's default constructorin A's default constructorin C's default constructor------Section 2------in B's default constructorin A's default constructorin C's copy constructorIn func1in C's destructorin A's destructorin B's destructor------Section 3------In func2------Section 4------in C's destructorin A's destructorin B's destructor5、写出下面程序的运行结果:#include <iostream>using namespace std;class A{ int x,y;public:A() { cout << "in A's default constructor\n"; f(); }A(const A&) { cout << "in A's copy constructor\n"; f(); }~A() { cout << "in A's destructor\n"; }virtual void f() { cout << "in A's f\n"; }void g() { cout << "in A's g\n"; }void h() { f(); g(); }};class B: public A{ int z;public:B() { cout << "in B's default constructor\n"; }B(const B&) { cout << "in B's copy constructor\n"; }~B() { cout << "in B's destructor\n"; }void f() { cout << "in B's f\n"; }void g() { cout << "in B's g\n"; }};void func1(A x){ x.f();x.g();x.h();}void func2(A &x){ x.f();x.g();x.h();}int main(){ cout << "------Section 1------\n";A a;A *p=new B;cout << "------Section 2------\n";func1(a);cout << "------Section 3------\n";func1(*p);cout << "------Section 4------\n";func2(a);cout << "------Section 5------\n";func2(*p);cout << "------Section 6------\n";delete p;cout << "------Section 7------\n";return 0;}答:------Section 1------in A's default constructorin A's fin A's default constructorin A's fin B's default constructor------Section 2------in A's copy constructorin A's fin A's fin A's gin A's fin A's gin A's destructor------Section 3------in A's copy constructorin A's fin A's fin A's gin A's fin A's gin A's destructor------Section 4------in A's fin A's gin A's fin A's g------Section 5------in B's fin A's gin B's fin A's g------Section 6------in A's destructor------Section 7------in A's destructor6、利用习题6.8的第14题中的时间类Time,定义一个带时区的时间类ExtTime。
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.一次。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第八章继承与多态习题
一.基本概念与基础知识自测题
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)?
答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。
称为同名覆盖(override)。
8.2.3派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的
调用?为什么?
答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。
派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。
二.编程与综合练习题(无)。