c++继承与派生习题答案

合集下载

继承与派生练习题

继承与派生练习题

习题八第八章继承与派生1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变)是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员)A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性)是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。

A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5. C++类体系中,能被派生类继承的是( B.虚函数)。

A.构造函数 B.虚函数 C.析构函数 D.友元函数6. 设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承)A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7. 指出下列对定义重载函数的要求中,哪些是错误的提法。

A.要求参数的个数不同B. 要求参数中至少有一个类型不同。

A.要求参数的个数不同。

B.要求参数中至少有一个类型不同。

C.不要求函数的返回值不同。

C++习题答案-4

C++习题答案-4

第4章:继承与派生类[4_1]答:类的继承方式有public(公有继承)、protected(保护继承)和private(私有继承)3种,不同的继承方式导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。

(1)基类中的私有成员无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中是不可直接访问的。

(2)基类中的公有成员当类的继承方式为公有继承时,基类中的所有公有成员在派生类中仍以公有成员的身份出现;当类的继承方式为私有继承时,基类中的所有公有成员在派生类中都以私有成员的身份出现;当类的继承方式为保护继承时,基类中的所有公有成员在派生类中都是以保护成员的身份出现。

(3)基类中的保护成员当类的继承方式为公有继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现;当类的继承方式为私有继承时,基类中的所有保护成员在派生类中都是以私有成员的身份出现:当类的继承方式为保护继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现。

[4_2]答:派生类不能直接访问基类的私有成员,但是可以通过基类提供的公有成员函数间接地访问基类的私有成员。

[4_3]答:保护成员可以被派生类的成员函数访问,但是对于外界是隐藏起来的,外部函数不能访问它。

因此,为了便于派生类的访问,可以将基类私有成员中需要提供给派生类访问的成员定义为保护成员。

C++规定,派生类对于保护成员的继承与公有成员的继承很相似,也分为两种情况:若为公有派生,则基类中的保护成员在派生类中也为保护成员;若为私有派生,则基类中的保护成员在派生类中成为私有成员。

[4_4]答:通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤消派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。

[4_5]答:当基类的构造函数没有参数或没有显示定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数。

C++第5章习题参考答案

C++第5章习题参考答案

1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。

继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。

它使得某类对象可以继承另外一类对象的特征和能力。

继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。

通过继承方式定义的子类也称为派生类。

2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。

对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。

表5.1列出了不同继承方式下基类成员访问属性的变化情况。

表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。

其余单元格内容为基类成员在派生类中的访问属性。

从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。

(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。

(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。

(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。

需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。

在同一类中私有成员和保护成员的用法完全一样。

3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。

具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。

保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。

这样,既方便了派生类的访问,又禁止外界对它的派生类访问。

C语言程序设计实验答案继承与派生

C语言程序设计实验答案继承与派生

C语⾔程序设计实验答案继承与派⽣实验07 继承与派⽣(4学时)(第7章继承与派⽣)⼀、实验⽬的⼆、实验任务7_1 声明⼀个基类Animal。

有私有整型成员变量age,构造其派⽣类dog,在其成员函数SetAge(int n)中直接给age 赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。

7_2 声明⼀个基类BaseClass。

有整型成员变量Number,构造其派⽣类DerivedClass,观察构造函数和析构函数的执⾏情况。

7_3 声明⼀个车(vehicle)基类。

具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派⽣出⾃⾏车(bicycle)类、汽车(motorcar)类。

⾃⾏车(bicycle)类有⾼度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。

从bicycle和motorcar派⽣出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。

如果不把vehicle设置为虚基类,会有什么问题?编程试试看。

7_4 以实验6中的People(⼈员)类为基类。

派⽣出student(学⽣)类,添加属性:班号char classNo[7];派⽣出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。

从student类中派⽣出graduate(研究⽣)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派⽣出TA(助教⽣)类,注意虚基类的使⽤。

重载相应的成员函数,测试这些类。

类之间的关系如图7-1所⽰。

图7-1 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。

构造派⽣类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提⽰:(注:在桌⾯创建⼀个⽂本⽂件,将输出框的内容复制到⽂本⽂件中,再复制到把age改为公有变量后重新编译就可以了。

实验5继承实验参考答案

实验5继承实验参考答案

实验5 继承与派生参考答案2 ) 分析下面的程序,指出程序运行的结果:#include<iostream.h>class CBase1{int x ;public:CBase1( ){x=0 ; cout<<"调用构造函数CBase1( )!\n";}CBase1( int a){x=1;cout<<"调用构造函数CBase1( int )!\n";}~CBase1( ){cout<<"调用析构函数~CBase1( )!\n";}};class CBase2{int y;public:CBase2( ){y=0 ;cout<<"调用构造函数CBase2( )!\n";}CBase2(int a){y=a ;cout<<"调用构造函数CBase2(int )!\n";}~CBase2(){cout<<"调用析造函数~CBase2( )!\n";}};class A{ int x;public:A() {x=0 ; cout<<"调用构造函数A( )!\n";}A(int a){x=a;cout<<"调用构造函数A(int )!\n";}~A(){cout<<"调用析构函数~A()!\n";}};class CDerived:public CBase1, virtual public CBase2{A a;public:CDerived(){cout<<"调用构造函数CDerived( )!\n";}CDerived(int x,int y ,int z):a(x),CBase1(y),CBase2(z){cout<<"调用构造函数CDerived(int,int )!\n";}~CDerived(){cout<<"调用析造函数~CDerived( )!\n";}};void main(){CDerived*x=new CDerived; CDerived y(2,3,4);delete x;cout<<"main()函数结束!\n"; }程序分析:a)类分析:本程序有三个类,其中类CDerived公有继承类CBase1和虚基类CBase2,类CDerived使用类A。

C++面向对象程序设计习题继承与派生

C++面向对象程序设计习题继承与派生

C++面向对象程序设计习题继承与派生继承与派生练习题1.什么是继承性?为什么说它是面向对象程序中的重要机制?所谓继承,就是从先辈处得到属性和行为特征。

2.C++中继承分为哪两个类?继承方式又分哪三种?基类和派生类public(公有)、private(私有)和protected(保护)继承3.三中继承方式中有哪些特点?不同基础更方式中派生类的对象对基类成员的访问有何不同?(1) 公有继承(public)方式:基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,而基类的私有成员在派生类中不可访问。

(2) 保护继承(protected)方式:基类中的公有成员和保护成员在派生类中都变成保护成员,而基类的私有成员在派生类中不可访问。

(3) 私有继承(private)方式:基类中的公有成员和保护成员在派生类中都变成私有成员,而基类的私有成员在派生类中不可访问。

因此,无论哪种继承方式,基类中的私有成员在派生类中都不允许访问,基类中的公有成员和保护成员都可以被派生类中的成员直接访问。

派生类对象对基类成员的访问1. 保护继承在类定义中,在关键字protected下说明的成员称为保护成员。

保护成员既具有私有的特性又具有公有的特性。

2. 公有继承在公有继承方式下,基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象只能访问基类的公有成员,不能访问基类的保护成员和私有成员。

3. 私有继承在私有继承方式下,基类中的公有成员和保护成员在派生类中都变成私有成员,因此,派生类的其它成员可以直接访问它们,但通过派生类的对象不能访问基类的任何成员。

4.如何定义单继承的派生类?如何定义多继承的派生类?一个派生类只有一个直接基类,则该继承称为单一继承一个派生类有多个直接基类,则该继承称为多重继承5.派生类与基类之间有什么关系?在面向对象程序设计中,继承就是一个新类可以从现有类获得特征,从现有类产生新类的过程就是类的派生。

程序设计教程(机械工业出版社)课后习题答案 第8章 继承――派生类

程序设计教程(机械工业出版社)课后习题答案  第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。

第3章-继承和派生习题

第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.引用&继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

继承与派生
概念填空题
1.1在C++中,三种派生方式的说明符号为 public 、 private 、 protected不加
说明,则默认的派生方式为private 。
1.2当公有派生时,基类的公有成员成为派生类的 公有成员 ;保护成员成为派
生类的 保护成员 ;私有成员成为派生类的 不能直接访问成员 。当保护派生时,
基类的公有成员成为派生类的 保护成员;保护成员成为派生类的 保护成员 ;
私有成员成为派生类的 不能直接访问成员 。
1.3 派生类的构造函数一般有3项工作要完成:首先 基类初始化 ,其次 成员
对象初始化,最后 执行派生类构造函数体 。
1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现 二
义性 。在派生类中采用 虚基类 或 作用域分辨符 来消除该问题。

3.选择题
3.1下面对派生类的描述中,错误的是(D )。
A.一个派生类可以作为另外一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员
D.派生类中继承的基类成员的访问权限到派生类中保持不变
3.2下列对友元关系叙述正确的是(A)。
A.不能继承
B.是类与类的关系
C.是一个类的成员函数与另一个类的关系
D.提高程序的运行效率
3.3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的
对象来直接访问。
A.任何成员 B.公有成员和保护成员
C.公有成员和私有成员 D.私有成员
3.4设置虚基类的目的是(B)。
A.简化程序 B.消除二义性
C.提高运行效率 D.减少目标代码
3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是
( C )。
A.派生类的对象可以赋给基类的对象
B.派生类的对象可以初始化基类的引用
C.派生类的对象可以直接访问基类中的成员
D.派生类的对象的地址可以赋给指向基类的指针
3.6有如下类定义:
class MyBASE{
int k;
public:
void set(int n) {k=n;}
int get( ) const {return k;}
};
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)。
A.4 B.3 C.2 D.1
3.7程序如下:
#include
using namespace std;
class A {
public:
A( ) {cout<<”A”;}
};
class B {public:B( ) {cout<<”B”;} };
class C: public A{
B b;
public:
C( ) {cout<<”C”;}
};
int main( ) {C obj; return 0;}
执行后的输出结果是(D)。
A.CBA B.BAC C.ACB D.ABC
3.8类O定义了私有函数F1。P和Q为O的派生类,定义为class P: protected
O{…}; class Q: public O{…}。(C)可以访问Fl。
A. O的对象 B. P类内 C. O类内 D. Q类内
3.9有如下类定义:
class XA{
int x;
public:
XA(int n) {x=n;}
};
class XB: public XA{
int y;
public:
XB(int a,int b);
};
在构造函数XB的下列定义中,正确的是(B)。
A.XB::XB(int a,int b):x(a),y(b){ }
B.XB::XB(int a,int b):XA(a),y(b) { }
C.XB::XB(int a,int b):x(a),XB(b){ }
D.XB::XB(int a,int b):XA(a),XB(b){ }
4.写出程序运行结果
4.l#include
using namespace std;
class B1{
public:
B1(int i){ cout<<”constructing B1 “<~B1( ){ cout<<”destructing B1 “<};
class B2 {
public:
B2( ){ cout<<”constructing B3 *”<~B2( ){ cout<<”destructing B3”<};
class C:public B2, virtual public B1 {
int j;
public:
C(int a,int b,int c):B1(a),memberB1(b) ,j(c){}
private:
B1 memberB1;
B2 memberB2;
};
int main( ){
C obj(1,2,3);
}
constructing B1 1
constructing B3 *
constructing B1 2
constructing B3 *
destructing B3
destructing B1
destructing B3
destructing B1

相关文档
最新文档