当前位置:文档之家› C++程序设计基础课后答案 第八章

C++程序设计基础课后答案 第八章

8.1 阅读下列程序,写出执行结果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;}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();}8.2 思考题1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?2.如果一个基类的虚函数被声明为私有成员函数,会有语法错误吗?可以在应用类体系时实现动态联编吗?请你验证一下。

3.虚函数和纯虚函数的区别是什么?4.一个非抽象类的派生类是否可以为抽象类?利用例8-11进行验证,从Hex_type类派生一个Hex_format类,其中包含一个纯虚函数Show_format(),然后定义Hex_format的派生类实现Show_format()。

1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?【答案】在C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。

程序通过用同一个基类指针访问不同派生类的虚函数重载版本实现程序运行时的多态。

C++的虚特性负责自动地在程序运行时把基类指针的关联类型转换成当前指向对象的派生类类型。

另外,抽象类机制提供了软件抽象和可扩展性的手段,实现运行时的多态性。

2.如果一个类的虚函数被声明为私有成员函数,会有语法错误吗?当它作为基类时,可以在应用类体系时实现动态联编吗?请你验证一下。

【答案】没有语法错误。

但在应用类体系时无法实现动态编联和多态。

因为私有成员函数只在类内可见,在类外无法调用,无法在类外通过基类指针实现多态。

程序略。

3.虚函数和纯虚函数的区别是什么?【答案】虚函数定义时冠以关键字virtual,本身有实现代码,作用是引导基类指针根据指向对象调用类体系中不同重载版本函数。

纯虚函数是指在说明时代码“为0”的虚函数,即纯虚函数本身并没有实现代码,必须通过它的派生类定义实现版本。

4.一个非抽象类的派生类是否可以为抽象类?利用例9-11进行验证,从Hex_type类派生一个Hex_format类,其中包含一个纯虚函数Show_format,然后定义Hex_format的派生类定义实现Show_format。

【答案】一个非抽象类的派生类可以为抽象类,即在派生类中定义了纯虚函数。

程序略。

8.3 编程题1.使用虚函数编写程序求球体和圆柱体的体积及表面积。

由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类Circle作为基类。

在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。

由Circle类派生Sphere类和Column类。

在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。

答案8.3-1#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( double r,double h ):circle( 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;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元。

定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。

答案8.3-2#include <iostream.h>#include <string.h>class teacher{ public:teacher( char tname[],int time ){ strcpy( name,tname );coursetime = time;}virtual int pay() = 0;virtual void print() = 0;char *getname(){ return name; }int getcoursetime(){ return coursetime; }protected:char name[30];int coursetime;};class professor:public teacher{ public:professor( char pname[],int time ):teacher( pname,time ){ }int pay(){ return 5000+coursetime*50; }void print(){ cout<<"教授:"<<getname(); }};class associateprofessor:public teacher{ public:associateprofessor( char pname[],int time ):teacher( pname,time ){ } int pay(){ return 3000 + coursetime * 30; }void print(){ cout << "副教授:" << getname(); }};class lecturer:public teacher{ public:lecturer( char pname[],int time ):teacher( pname,time ){ }int pay(){ return 2000 + coursetime * 20;}void print(){ cout << "讲师:" << getname();}};void main(){ professor pobj( "李小平",32 );pobj.print();cout << '\t' << "工资:" << pobj.pay() << endl;associateprofessor apobj( "王芳芳",56 );apobj.print();cout << '\t' << "工资:" << apobj.pay() << endl;lecturer lobj( "何大建",72 );lobj.print();cout << '\t' << "工资:" << lobj.pay() << endl;}3.改写第7章习题7.4第3题,把Shape类定义为抽象类,提供共同操作界面的纯虚函数。

相关主题