当前位置:文档之家› 第五章作业答案

第五章作业答案

一、选择题CACCDDB二、问答题1、理解继承和派生的定义。

什么叫单继承?什么叫多继承?答:继承是指在定义一个新类时,首先把一个或多个已有类的功能全部包含进来,然后再给出新功能的定义或对已有类的功能进行重新定义。

在C++中被继承的类称为基类;从其他类继承的类成为派生类。

C++支持单继承和多继承。

单继承是指一个类只能有一个直接基类;多继承是指一个类是从多个基类继承而来。

2、公有继承、保护继承、私有继承基类成员的属性在派生类中分别会发生什么样的变化?试分析之答:公有继承时,基类的公有成员和保护成员在派生类中依然是公有成员和保护成员,基类的私有成员不可见;在保护继承时,基类的公有成员和保护成员在派生类中都变为保护成员,基类的私有成员在派生类中不可见;私有继承时,基类的公有成员和保护成员在派生类中都变为私有成员,基类的私有成员在派生类中不可见。

3、为什么要设置虚基类?在C++中如何说明虚基类?当创建一个其间接基类为虚基类的派生类的对象时,构造函数与析构函数的调用次序分别是什么?答:共同祖先基类多重拷贝容易引发同名冲突:在多层派生类中,派生类有多个直接或间接的基类,其中有一个基类是其余某些基类的共同祖先,在访问派生类的某些成员时,会引发同名冲突问题,所以要设置虚基类,设置虚基类保证虚基类的构造函数至多被调用一次;虚基类的说明:虛基类的定义通过关键字v irtual实现,语法形式为:class派生类名:继承方式virtual 基类名或者class派生类名:virtual继承方式基类名。

构造函数和析构函数的调用次序为:(1)所有虚基类的构造函数(按定义顺序);(2)所有直接基类的构造函数(按定义顺序);(3)所有对象成员的构造函数(按定义顺序)(4)派生类自己的构造函数析构函数的调用次序与之完全相反。

4、派生类对象在访问基类成员时,基类成员的访问属性会受到哪些因素的影响?答:(1)对于公有继承,只有基类的公有成员可以被"派生类对象”访问,其他(保护和私有)成员不能被访问。

(2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象”访问。

三、读程序按要求作答1、运行下列程序,分析并写出创建obj对象时构造函数的执行步骤,解释输出结果中的Constructing A ,n=5是执行到哪个构造函数时输出的?#include<iostream>#include<cmath>using namespace std;class Aint n;public:A(int x)n-x; cout<<^Constructing A ,n=,r«n«encll;}'AO{cout«n Destructing A t n="«n«endl;}};class B{int n;A a;public:B(int x,int y):a(x){n=y;cout«n Constructing B. n二}'BO{cout«n Destructing B, n= *«n«endl;}};class C{int n;A a;B b;public:C(int x,int y,int z):a(x*2),b(x,y)cout«H C on struct i ng C, n= «n«endl;}~C(){cout«H Destructing C, n= w«n«endl; }};int main()C obj(5,6,7);return 0;答:程序中构造函数的调用次序为:按照定义的顺序•先调用C类中对像成员A的构造函数, 再调用B类中对象成员A的构造函数,然后调用构造函数B,最后调用构造函数C;Constructing A ,n=5是调用B类的对象成员A的构造函数输出的。

2、找出下面程序中的错误,并进行改正,写出正确的输出结果。

(1) # i nc1ude< i ostream>using namespace std;class base{int x;public:void setx(int n)lx=n;}void showx(){cout«x<<endl;}};class derived:base{int y;public:void setxy(int n t int m){setx(n); y=m;}void showxy(){cout<<x; showx (); cout<<y«endl ; }};main(){derived obj; obj.setx(10); ob j・ showx (); obj.setxy(20,30); obj.showxy (); return 0;}#inc]ude〈iostream> using namespace std; class X(2)int a;public:void setX(int x){a=x;}void showx(){cout«w a=,,«a«endl;}};class Y{int b;public:void setY(int x){b=x;}void showYO{cout<<"b="<<b<<endl;} };class Z:public X.private Y{ int c;public:void setZ(int x,int y){c=x;setY(y);}void showZO{ showY ();cout«w c=w«c«endl; }};void mainO{Z obj;obj. setX(3);obj. showX ();obj. setY(4);obj. showY ();obj. setZ(6,8);obj. showZ ();}答:(1)把cout«x;修改为showx():obj. setx(10);修改为obj. setxy (10.0);obj. showx();修改为obj. showxy ();运行结果为:102030Press any key to continue(2) obj. setY(4);修改为obj. setZ(3.4);obj. showY ();修改为showZ ();运行结果为:a=3b=4c=3b二8c=6Press any key to continue3、阅读下列程序,并写出运行结果。

如果去掉派生类方式中的virtual,程序会出错吗?为什么#i nclude〈iostreani>using namespace std;class base(pi'otected:int a;public:base(){a=5;cout«"b3se a=w«a«endl;}};class basel:virtual public base{public:basel (){a=a+10;cout«1'basel a=M«a«endl;}};class base2:virtual public base (public:base2(){cout<<"base2 a=,,«a«endl;} };class derived:public basel,public base2 public:derived (){cout«rT derived a=,,«a«endl;}};main(){derived obj;return 0;}答:运行结果为:base a=5basel a=15base2 a=35derived a=35如果去掉运行方式中的virtual,程序一定会出错,因为语句:derived obj;的执行中cout«M derived a=«a«endl;出现了二义性,因为有两个3,系统不知道需要输出哪个4、阅读程序,回答能否在main函数中用cl.flO, cl.f2(), cl.f3(), cl.f4()调用fl, f2, f3, f4成员函数,为什么?#include<iostream>using namespace std;class A{public:void fl ();int i:protected:void f2();int j;private:int k;};class B:public A{public:void f3();protected:int m;};private:int n;};class C:public Bpublic:void f4 ():private:int p;};int main(){A al;B bl;C cl;• • •return 0;}答:可以调用成员函数fl,f3,f4・因为它们是公用成员函数,不能调用成员函数f2 .因为它是保护成员函数。

5、阅读程序,写出p->f()的输出结果是什么并说明原因斗i nc1ude<iostream>using namespace std;class X{public:void f(){cout«"X: : f () executing\n,r;}};class Y:pub1ic X{public:void f()(cout«"Y:: f () executing\n n;}}:int main(){X X;Y y;X *p=&x;p->f 0 ;P 二&y;p->f 0 ;y. f 0 ;return 0;}5, p-〉f()的输出结果分别为:X::f()executingX::f()executing因为X *p=&x;是把变量X的地址賦值给指针p,调用的是类X的成员函数,所以输出结果为X::f()executing;因为賦值后的引用只可以访问基类成员,不可以访问派生类中的新増成员。

四、编程题1、要求先定义一个Point类,用来产生平面上的点对象。

两点确定一条线段,即线段由点所构成。

因此,Line类使用Point类的对象作为数据成员,然后在Line类的构造函数里求出线段的长度。

相关主题