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层具体类才能提供全部函数的实现。在测试函数中,使用基类指针实现不同派生类对象的操作。
解答:略