C++作业答案第7章继承7.1 选择题1.在c++中,类与类之间的继承关系具有( c )。
(a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性2.下列关于类的继承描述中,( a,b )是错误的。
(a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数(b) 派生类也是基类,所以基类具有派生类的全部属性和方法(c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法(d) 一个基类可以有多个派生类,一个派生类可以有多个基类3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员6.不论派生类以何种方式继承基类,都不能使用基类的( b )。
(a) public 成员 (b)private成员(c) protected成员 (d)public 成员和protected成员7.下面描述中,错误的是( b, c )。
(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问(b) 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问(c) 在基类定义的public和protected成员在保护继承的派生类中不可见(d) 在派生类中不可见的成员要变成可访问的需进行访问声明8.在c++中,不能被派生类继承的函数是( b,c )。
(a) 成员函数 (b)构造函数(c) 析构函数 (d)静态成员函数9.在创建派生类对象时,构造函数的执行顺序是( d )。
(a) 对象成员构造函数、基类构造函数、派生类本身的构造函数(b) 派生类本身的构造函数、基类构造函数、对象成员构造函数(c) 基类构造函数、派生类本身的构造函数、对象成员构造函数(d) 基类构造函数、对象成员构造函数、派生类本身的构造函数10.当不同的类具有相同的间接基类时,有特点( d )。
(a) 各派生类对象将按继承路线产生自己的基类版本(b) 派生类对象无法产生自己的基类版本(c) 为了建立惟一的间接基类版本,应该必须改变类格(d) 为了建立惟一的间接基类版本,应该声明虚继承7.2 阅读下列程序,写出执行结果1.#include <iostream.h>class BASE{ public:void get( int i,int j,int k,int l ){ a = i; b = j; x = k; y = l; }void print(){ cout << "a = "<< a << '\t' << "b = " << b << '\t'<< "x = " << x << '\t' << "y = " << y << endl;}int a,b;protected:int x, y;};class A: public BASE{ public:void get( int i, int j, int k, int l ){ BASE obj3;obj3.get( 50, 60, 70, 80 );obj3.print();a = i;b = j; x = k; y = l;u = a + b + obj3.a ; v = y - x + obj3.b;}void print(){ cout << "a = " << a << '\t' << "b = " << b << '\t'<< "x = " << x << '\t' << "y = " << y << endl;cout << "u = " << u << '\t' << "v = " << v << endl;}private:int u, v ;};void main(){ BASE obj1;A obj2;obj1.get( 10, 20, 30, 40 );obj2.get( 30, 40, 50, 60 );obj1.print();obj2.print();}答案:a = 50b = 60 x = 70 y = 80a = 10b = 20 x = 30 y = 40a = 30b = 40 x = 50 y = 60u = 120 v = 702. #include <iostream.h>class BASE1{ public:BASE1( int i ) { cout << "调用基类BASE1的构造函数:" << i << endl ; }};class BASE2{ public:BASE2( int j ) { cout << "调用基类BASE2的构造函数:" << j << endl ; }};class A: public BASE1, public BASE2{ public:A( int a, int b, int c, int d ) : BASE2(b), BASE1(c), b2(a), b1(d) { cout << "调用派生类A的构造函数:" << a+b+c+d << endl; } private:BASE1 b1;BASE2 b2;} ;void main(){ A obj( 1, 2, 3, 4 ); }答案:调用基类BASE1的构造函数:3调用基类BASE2的构造函数:2调用基类BASE1的构造函数:4调用基类BASE1的构造函数:1调用派生类A的构造函数:107.3 编程题1.定义一个rectangle类,它包含两个数据成员length和width;以及包含用于求长方形面积的成员函数。
再定义rectangle的派生类rectangular,它包含一个新数据成员height和用来求长方体体积的成员函数。
在main函数中,使用两个类,求某个长方形的面积和某个长方体的体积。
解答:#include<iostream.h>class rectangle{public:rectangle( float l,float w ){ length = l;width = w; }float area(){ return( length*width ); }float getlength() { return length; }float getwidth() { return width; }private:float length;float width;};class rectangular:public rectangle{ public:rectangular( float l,float w,float h ) : rectangle( l,w ){ height = h; }float getheight() { return height; }float volume() { return area() *height; }private:float height;};void main(){ rectangle obj1( 2,8 );rectangular obj2( 3,4,5 );cout << "length=" << obj1.getlength() << '\t' << "width=" << obj1.getwidth() << endl;cout << "rectanglearea=" << obj1.area() << endl;cout << "length=" << obj2.getlength() << '\t' << "width=" << obj2.getwidth();cout << '\t'<< "height=" << obj2.getheight() << endl;cout << "rectangularvolume=" << obj2.volume() << endl;}2. 假设某销售公司有销售经理和销售员工,月工资的计算办法是:销售经理的固定月薪为8000元并提取销售额的千分之五作为工资;销售员工只提取销售额的千分之五作为工资。
编一程序,定义一个基类employee,它包含三个数据成员number、name和salary,以及用于输入编号和姓名的构造函数。
由employee类派生salesman类,再由salesman类派生salesmanager类。
salesman类包含两个新数据成员 commrate和sales,还包含用于输入销售额并计算销售员工工资的成员函数pay()和用于输出的成员函数print()。
salesmanager类包含新数据成员 monthlypay,及用于输入销售额并计算销售经理工资的成员函数pay()、用于输出的成员函数print()。