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.一次。
c 继承与派生习题答案
继承与派生概念填空题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)。
继承与派生类答案
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
继承与派生类答案
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
第8章 继承与多态性习题参考答案
C++程序设计语言习题及实验指导第8章继承与多态性习题参考答案8.3 习题8.3.1 选择题8.3.2 填空题1.(1) a、b、c、x、y、z (2) b、y (3) c、z (4) a、x (5) b、c、x、y、z(6) b、y (7) y (8) b、c、z (9) a、x (10) b、c、x、y、z (11) y(12) y (13) z (14) a、b、c、x (15) b、c、x、y、z (16) y 2.私有3.抽象4.虚基5.(1) 基类(2) 对象6.(1) 静态(2) 编译(3) 虚函数7.(1) 2 1 (2) 0 58.(1) 100 200 300 30 (2) 10 100 (3) 20 200 9.(1) 5 10 (2) end. (3) 20 1010.(1) classA classB (2) end. (3) ~classB ~classA 11.(1) 10 (2) build B (3) build C (4) release A12.(1) class B (2) class C (3) class D (4) 513.(1) 5 5 (2) 20 2014.(1) 10 (2) 10 2015.(1) 1 (2) 3 (3) 5 (4) 100 1016.(1) B::f() (2) B::fun() (3) A::f() (4) B::fun()17.(1) 姓名陈涛年薪6.8万元。
(2) 姓名李原(3) 姓名李原月工资4000元18.(1) 110 (2) 222019.(1) protected 或public (2) Base1(s1),Base2(s2) 或Base2(s2),Base1(s1)(3) Base1::str (4) test.print()20.(1) virtual void show()=0 (2) C(int,int,int) (注:参数可有任一名称)(3) b1(y) (4) &t8.3.3 编程题1.求长方形的面积和长方体的表面积、体积#include<iostream.h>class Rectangle{protected:float L; // 长方形的长float W; // 长方形的宽float area; // 长方形的面积public:Rectangle(float L1,float W1){L=L1;W=W1;}void function() { area=L*W; }void show(){cout<<"长为"<<L<<",宽为"<<W<<"的长方形面积为"<<area<<endl;}};class Cuboid:public Rectangle{float H; // 长方体的高float volume; // 长方体的体积public:Cuboid(float a,float b,float c):Rectangle(a,b){ H=c; }void function() { area=(L*W+L*H+W*H)*2; }void fun() { volume=L*W*H; }void show(){cout<<"长为"<<L<<",宽为"<<W<<",高为"<<H<<"的长方体表面积为"<<area<<",体积为"<<volume<<endl;}};void main(){Rectangle r(2,3); r.function(); r.show();Cuboid c(2,3,4); c.function(); c.fun(); c.show();}2.产生并输出圆桌信息#include<iostream.h>#include<string.h>class Circle{protected:double radius;double area;public:Circle(double r) { radius=r; }};class Table{protected:double height;public:Table(double h) { height=h; }};class Roundtable:public Table,public Circle{char *color;public:Roundtable(double h,double r,char c[]):Circle(r),Table(h) {color=new char[strlen(c)+1];strcpy (color, c);}void fun() { area=3.14*radius*radius; }void show(){cout<<"高度:"<<height<<"米"<<endl;cout<<"面积:"<<area<<"平方米"<<endl;cout<<"颜色:"<<color<<endl;}~Roundtable() { delete []color; }};void main(){Roundtable rt(0.75,1.1,"黑色");rt.fun(); rt.show();}3.计算企业的经营税#include<iostream.h>#include<string.h>class Tax{protected:char name[50]; // 企业名称double income; // 经营收入double taxes; // 税金public:Tax(char *n,double in){strcpy(name,n);income=in;}virtual void fun()=0;void show(){cout<<name<<"的经营收入为"<<income<<"万元,税金为"<<taxes<<"万元\n";}};class Service:public Tax{public:Service(char *n,double in):Tax(n,in){ }void fun(){taxes=income*5/100;}};class Fabrication:public Tax{public:Fabrication(char *n,double in):Tax(n,in){ }void fun(){taxes=income*17/100;}};void print(Tax &t) { t.fun(); t.show(); }void main(){char name[50];int income;cout<<"请输入服务性企业名称:"; cin>>name;cout<<"请输入经营收入(万元):"; cin>>income;Service s(name,income); print(s);cout<<"请输入生产性企业名称:"; cin>>name;cout<<"请输入经营收入(万元):"; cin>>income;Fabrication f(name,income); print(f);}4.把原始体育成绩转换为等第#include<iostream.h>class Sports{protected:int item; // 项目char name[20]; // 姓名double score; // 原始成绩char grade[10]; // 评定等第public:Sports(int i,char *n){item=i;strcpy(name,n);cout<<"请输入原始成绩:";cin>>score;}void show(){cout<<name<<"的"<<item<<"米成绩为"<<score<<"秒,等第为"<<grade<<endl;}virtual void change()=0;};class Run50:public Sports{public:Run50(int i,char *n):Sports(i,n){ }void change(){if(score<=6.50)strcpy(grade,"优秀");else if(score<=6.70)strcpy(grade,"良好");else if(score<=7.10)strcpy(grade,"及格");else strcpy(grade,"不及格");}};class Run100:public Sports{public:Run100(int i,char *n):Sports(i,n){ }void change(){if(score<=13.10)strcpy(grade,"优秀");else if(score<=13.70)strcpy(grade,"良好");else if(score<=14.90)strcpy(grade,"及格");else strcpy(grade,"不及格");}};class Run1000:public Sports{public:Run1000(int i,char *n):Sports(i,n){ }void change(){if(score<=203.00)strcpy(grade,"优秀");else if(score<=213.00)strcpy(grade,"良好");else if(score<=233.00)strcpy(grade,"及格");else strcpy(grade,"不及格");}};class Run1500:public Sports{public:Run1500(int i,char *n):Sports(i,n){ }void change(){if(score<=323.00)strcpy(grade,"优秀");else if(score<=337.00)strcpy(grade,"良好");else if(score<=365.00)strcpy(grade,"及格");else strcpy(grade,"不及格");}};void main(){Sports *s;int it;cout<<"请输入项目(50/100/1000/1500):"; c in>>it;char na[20];cout<<"请输入姓名:"; c in>>na;if(it==50) { Run50 r50(it,na); s=&r50; s->change(); s->show(); }else if(it==100) { Run100 r100(it,na); s=&r100; s->change(); s->show(); }else if(it==1000) { Run1000 r1000(it,na); s=&r1000; s->change(); s->show(); } else if(it==1500) { Run1500 r1500(it,na); s=&r1500; s->change(); s->show(); } else { cout<<"输入项目错误\n"; exit(0); }}8.4 实验指导8.4.1 派生类的定义与使用:设计一个程序求三角函数的值。
C语言第八章习题带答案-2012.11.6更新[优秀范文五篇]
C语言第八章习题带答案-2012.11.6更新[优秀范文五篇]第一篇:C语言第八章习题带答案-2012.11.6更新练习8答案选择题1.在程序中要使用语句:printf(“%sn”, STRING);输出一个长度为5个字符的提示信息“OK!”,则应使用宏定义语句(D)。
A.#define STRING “OK!”B.#define STRING “"OK!”“C.#define STRING ”OK!“D.#define STRING ”“OK!”“2.以下正确的描述为(C)。
A.每个C语言程序必须在开头用预处理命令#includeB.预处理命令必须位于C源程序的首部C.在C语言中预处理命令都以”#“开头D.C语言的预处理命令只能实现宏定义和条件编译的功能3.C语言的编译系统中宏命令是(D)。
A.在程序运行时进行代换处理的B.在程序连接时进行处理的C.和源程序中其他C语句同时进行编译的D.在对源程序中其他成分正式编译之前进行处理的4.从下列选项中选择不会引起二义性的宏定义是(D)。
A.#define POWER(x)x*xB.#define POWER(x)(x)*(x)C.#define POWER(x)(x*x)D.#define POWER(x)((x)*(x))5.若有宏定义如下:#define X 5#define Y X+1#define Z Y*X/2则执行以下printf语句后,输出结果是(D)。
int a;a=Y;printf(”%d,“, Z);printf(”%dn“,--a);A.7,6B.12,6C.12,5D.7,56.若a、b、c、d、t均为int型变量,则执行以下程序段后结果为(C)。
#define MAX(A, B)(A)>(B)?(A):(B)#define PRINT(Y)printf(”Y=%dn", Y)……a=1;b=2;c=3;d=4;t=MAX(a+b, c+d);PRINT(t);A.Y=3B.存在语法错误 C.Y=7D.Y=0第二篇:第二章习题带答案一、单项选择题1、下列关于国内信用证的说法中,错误的是()。
继承和派生习题与解析
void car::show() {
cout <<" 车型:小车" << endl; vehicle::show(); cout << "载人:" << passenger_load << "人" << endl; cout << endl; } truck:: truck(int wheels, float weight,int passengers, float max_load):vehicle(wheels,weight) { passenger_load=passengers; payload=max_load; } int truck::get_passengers() { return passenger_load; } float truck::efficiency() { return payload/(payload+weight); }
输出结果 车型:小车 车轮:4个 重量:2000公斤 载人:5人
车型:卡车 车轮:10个 重量:8000公斤 载人:3人 效率:0.977012
7 设计一个圆类circle和一个桌子类table,另设计一 个圆桌类roundtable,它是从前两个类派生的,要求 输出一个圆桌的高度、面积和颜色等数据。
解: 本题说明单继承情况下构造函数和析构函数的调用
顺序。这里base为基类,subs为派生类。 所以输出为:
constructing base class constructing sub class destructing sub class destrcuting base class 注意:在单继承情况下,首先调用基类的构造函数 , 随后调用派生类的构造函数,析构函数的调用顺序则 正好相反。
最新《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 继承与派生练习题
c 继承与派生练习题C++是一种面向对象的编程语言,其中最重要的概念之一就是继承与派生。
继承允许一个类(称为派生类)从另一个类(称为基类)中继承属性和行为。
这个过程允许我们在派生类中使用基类的成员,同时还可以添加新的成员或者修改基类成员的行为。
在这篇文章中,我们将通过一些练习题来巩固与继承与派生有关的概念和技能。
这些练习题旨在帮助读者更好地理解和应用这些概念。
首先,考虑一下以下的代码段:```cppclass Shape {protected:int width, height;public:Shape(int w, int h) : width(w), height(h) {}virtual int area() = 0;};class Rectangle : public Shape {public:Rectangle(int w, int h) : Shape(w, h) {}int area() override { return width * height; }};class Triangle : public Shape {public:Triangle(int w, int h) : Shape(w, h) {}int area() override { return (width * height) / 2; }};```通过观察上述代码,我们可以看到Shape是一个基类,其派生类有Rectangle和Triangle。
这些派生类通过公有继承的方式继承了Shape类的成员。
另外,注意到Shape类中的区域函数area()被声明为纯虚函数。
接下来,我们通过一些练习题来检验对继承和派生的理解。
练习题1:向Shape的派生类中添加新的成员在给定的代码段中,尝试向Rectangle和Triangle类中添加一个新的成员,例如颜色color。
然后,尝试在main()函数中创建一个Rectangle对象和一个Triangle对象,并打印出它们的属性(包括颜色)和区域。
继承和派生习题
继承和派生习题一、单选题1.若类A和类B的定义如下:class A{int i,j;public:int geti(){return i;}};class B: public A{int k;public:void make(){k=i*j;}};则上述中,()是非法的表达式。
A.k=i*j B.int k; C.return i; D.void make();2.关于公有继承,下列说法错误的是()。
A.基类的公有成员和保护成员被继承后作为派生类的公有成员和保护成员。
B.派生类的其他成员可以直接访问基类的公有成员和保护成员。
C.派生类的对象可以访问基类的私有成员。
D.派生类成员和对象都无法访问基类的私有成员。
3.下列说法中错误的是()。
A.公有继承时基类中的public成员在派生类中仍是public的;B.公有继承时基类中的private成员在派生类中仍是private的;C.私有继承时基类中的public成员在派生类中是private的;D.保护继承时基类中的public成员在派生类中是protected的;4.在公有继承中,基类中的公有成员作为派生类的()。
A.公有成员B.私有成员C.保护成员D.私有成员函数5.基类中的()不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开放的接口。
A.公有成员B.私有成员C.保护成员D.私有成员函数6.在下面的表达式中,不表示虚继承的是()。
A.virtual publicB.public virtualC.publicD.virtual7.设置虚函数的声明中,正确的是()。
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码8.下面叙述错误的是()。
A.基类的protected成员在派生类中仍然是protectedB.基类的protected成员在public派生类中仍然是protected的C.基类的protected成员在private派生类中是private的D.基类的protected成员不能被派生类的对象访问9.派生类的对象对它的基类成员中()是可以访问的。
C++第一至第八章课后习题答案
第1章概述思考与练习题参考答案1、简述C++的发展简况。
答:C++语言是从C语言发展而来的,C 语言是一种编译型的面向过程的程序设计语言,它最早是从英国剑桥大学一个名叫Martin Richards的学者在60年代开发的BCPL( 即Basic Combind Programming Language)语言的基础之上发展而来的。
BCPL语言是Martin Richards 在开发系统软件时,作为描述性语言而使用的一种程序设计语言。
1970年,美国Bell实验室的Ken?Thompson在软件开发工作中,继承和发展了BCPL语言的许多特点,进一步提出了一种叫“B语言”的语言。
随后,在美国Bell实验室实现的更新型的小型机PDP-11的UNIX操作系统的研发工作中,于1972年推出了一种新型的程序语言—C语言,该语言一经推出就在国际上广泛流行。
20世纪80年代,由于软件工程的需要,面向对象程序设计方法在软件设计领域引起了普遍的重视,A T&T Bell实验室的计算机科学家Bjarne Stroustrup结合流行的C语言的所有成分,开发出了面向对象的程序设计语言C++。
2、C++语言有那些主要特点?答:C ++ 语言具有以下主要特点:(1)C++语言是一个中级的程序设计语言。
(2)C++是一个结构化的程序设计语言。
(3)C++是一种面向对象的程序设计语言。
(4)C++语言是一个功能齐全的编程语言。
(5)C++语言是一种移植性很好的编程语言。
3、编写的C++语言的程序主要由那些基本组成部分构成?答:C++语言的程序主要由以下几个基本组成部分构成:(1)预处理命令:C++语言提供了三类预处理命令:宏定义命令(define)、文件包含命令(include)、条件编译命令(if~else~endif),(2)输入/输出语句(Input/Output语句,简称I/O语句):C++语言的程序中总是少不了输入和输出的语句,实现与程序内部的信息交流。
- 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派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的
调用?为什么?
答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。
派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。
二.编程与综合练习题(无)。