C++作业答案
第8章 虚函数与多态性
8.1 选择题
1.在C++中,要实现动态联编,必须使用( d )调用虚函数。
(a) 类名 (b) 派生类指针 (c) 对象名 (d) 基类指针
polo座套2.下列函数中,可以作为虚函数的是( c,d )。
(a) 普通函数 (b) 构造函数 (c) 成员函数 (d) 析构函数
3.在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( b )。
(a) 不同 (b) 相同 (c) 相容 (d) 部分相同
4.下面函数原型声明中,( b )声明了fun为纯虚函数。
(a) void fun()=0; (b)virtual void fun()=0;
(c) virtual void fun(); (d)virtual void fun(){ };
5.若一个类中含有纯虚函数,则该类称为( d )。
(a) 基类 (b) 纯基类 (c) 派生类 (d) 抽象类
6.假设 Aclass为抽象类,下列声明( a,c,d )是错误的。
(a) Aclass fun( int ) ; (b)Aclass * p ;
(c) int fun( Aclass ) ; (d)Aclass Obj ;
7.下面描述中,正确的是( b,d )。
(a) 虚函数是没有实现的函数 (b) 纯虚函数的实现在派生类定义
(c) 抽象类是只有纯虚函数的类 (d) 抽象类指针可以指向不同的派生类
8.2 阅读下列程序,写出执行结果
1.#include <iostream.h>
class Bclass
{ public:
Bclass( int i, int j ) { x = i; y = j; }
virtual int fun() { return 0 ; }
protected:
int x, y ;
};
class Iclass:public Bclass
{ public :
Iclass(int i, int j, int k):Bclass(i, j) { z = k; }
int fun() { return ( x + y + z ) / 3; }
private :
int z ;
};
void main()
{ Iclass obj( 2, 4, 10 );
Bclass p1 = obj;
cout << p1.fun() << endl;
Bclass & p2 = obj ;
cout << p2.fun() << endl;
cout << p2.Bclass :: fun() << endl;
Bclass *p3 = &obj;
cout << p3 -> fun() << endl;
}
答案:
0
5
0
5
2.#include <iostream.h>
class BASE
{ public:
virtual void getxy( int i,int j = 0 ) { x = i; y = j; }
virtual void fun() = 0 ;
protected:
int x , y;
} ;
class A: public BASE
{ public:
void fun()
{ cout<<"x = "<<x<<'\t'<<"y = x * x = "<<x*x<<endl; }
};
class B:public BASE
{ public:
void fun()
{ cout << "x = " << x << '\t' << "y = " << y << endl;
cout << "y = x / y = " << x / y << endl;
}
} ;
void main()
{ BASE * pb;
A obj1;
B obj2;
pb = &obj1;
pb -> getxy( 10 );
pb -> fun();
pb = &obj2;
pb -> getxy( 100, 20 );
pb -> fun();
}
答案:
x = 10 y = x*x = 100
x = 100 y = 20
y = x / y = 5
8.3 编程题
1.使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类circle作为基类。在circle类中定义一个数据成员radius和两个虚函数area()和volume()。由circle类派生sphere类和column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。
解答:
#include <iostream.h>
const double PI=3.14159265;
class circle
{ public:
circle(double r) { radius = r; }
virtual double area() { return 0.0; }
virtual double volume() { return 0.0; }
protected:
double radius;
};
class sphere:public circle
{ public:
sphere( double r ):circle( r ){ }
double area() { return 4.0 * PI * radius * radius; }
double volume()
{ return 4.0 * 奔驰论坛PI * radius * radius * radius / 3.0; }
};
class column:public circle
{ public:
column( 法拉利f360double r,double h ):circle(奔驰cclass r ) { height = h; }
double area()
{ return 2.0 * PI * radius * ( height + radius ); }
double volume()
{ return PI * radius * radius * height; }
private:
double height;
};
void main()
{ circle *p;
长安福特smax sphere sobj(2);
p = &sobj;
cout << "球体:" << endl;
cout << "体积 = " << p->volume() << endl;
cout << "表面积 = " << p->area() << endl;
column cobj( 3,5 );
p = &cobj;
cout << "圆柱体:" << endl;
cout << "体积 = " 挂车倒车<< p->volume() << endl;
cout << "表面积 = " << p->area() << endl;
}
2.某学校对教师每月工资的计算规定如下:固定工资+课时补贴。教授的固定工资为5000元,每个课时补贴50元。副教授的固定工资为3000元,每个课时补贴30元。讲师的固定工资为2000元,每个课时补贴20元。定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。
解答:略。
3.改写第7章习题7.3第3题,把Shape类定义为抽象类,提供共同操作界面的纯虚函数。TwoDimShape类和ThreeDimShape类仍然抽象类,第3层具体类才能提供全部函数的实现。在测试函数中,使用基类指针实现不同派生类对象的操作。
解答:略
发布评论