二、选择题(至少选一个,可以多选)
(1)用关键字( A )标记的函数被称为虚函数。
A. virtual B. private C. public D. protected
(2)在C++中,要实现动态联编,必须使用( D )调用虚函数。
A. 类名 B. 派生类指针 C. 对象名 D. 基类指针
(3)下列函数中,可以作为虚函数的是( BD )。
A. 普通函数 B. 非静态成员函数 C. 构造函数 D. 析构函数
(4)在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( B )。
A. 不同 B. 相同 C. 相容 D. 部分相同
(5)使用虚函数保证了在通过一个基类类型的指针(含引用)调用一个虚函数时,C++系统对该调用进行( A ),但是,在通过一个对象访问一个虚函数时,使用( B )。
A. 动态联编 B. 静态联编 C. 动态编译 D. 静态编译
(6)下面函数原型声明中,( B )声明的func()为纯虚函数。
A. void func()=0; B. virtual void func()=0;
C. vitual void func(); D. virtual void func(){};
(7)若一个类中含有纯虚函数,则该类称为( C )。
A. 基类 B. 虚基类 C. 抽象类 D. 派生类
(9)下面描述中,( BD )是正确的。
A. 虚函数是没有实现的函数 B. 纯虚函数的实现是在派生类中定义
三、判断题
(1)抽象类中只能有一个纯虚数。 ( 错 )
(2)构造函数和析构函数都不能说明为虚基数。 ( 错 )
(3)程序中可以说明抽象类的指针或引用。 ( 对 )
(4)一个类中的虚基数说明不仅对基类中的同名函数有影响,而且对它的派生类中的重定义的函数也有影响 ( 错 )
(5)在构造函数和析构函数中调用虚函数时,采用动态联编,即它们所调用的虚函数时是在派生类中重定义的虚函数。 ( 错 )
(6)因为没有为纯虚函数定义代码,所以在构造函数和析构函数内均不可调用纯虚函数。 ( 对 )
四、简答题
(1)什么叫做多态性?在C++中是如何实现多态的?
(2)虚函数与一般重载函数有哪些区别?
五、程序设计题
(1)使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类Circle作为基类。在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。由Circle 类派生Sphere类和Column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积
#include <iostream>
#include <iomanip>
using std::fixed;
using std::setprecision;
using namespace std;
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/3.0*PI*radius*radius*radius;}
};
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;
};
int main()
{
Sphere s(3.0);
Column c(4.0,5.0);
cout <<fixed<<setprecision(2)<< "球的体积 = " << s.volume() << endl;
cout << fixed<<setprecision(2)<<"球的表面积 = " << s.area() << endl;
cout << fixed<<setprecision(2)<<"圆柱体的体积 = " << c.volume() << endl;
cout <<fixed<<setprecision(2)<< "圆柱体的表面积 = " << c.area() << endl;
return 0;
}
运行结果:
(2)编写一个程序,用于计算正方形、三角形和圆的面积及计算各类形状的总面积。
程序如下:
#include<iostream>
#include<iomanip>
using std::fixed;
using std::setprecision;
const double PI=3.1415;
using namespace std;
class square
{
public:
square(float l){length=l;}
virtual float area(){return length*length;}
private:
float length;
};
class triangle
{
public:
triangle(float b,float h){base=b;height=h;}
virtual float area(){return base*height/2.0;}
private:
float base,height;
};
class Circle
{
public:
Circle(double r){radius=r;}
virtual double area(){return PI*radius*radius;}
private:
double radius;
};
int main()
{
square s(6.0);
triangle t(3.0,4.0);
Circle c(5.0);
cout<<fixed<<setprecision(2)<<"正方形的面积="<<s.area()<<endl;
cout<<fixed<<setprecision(2)<<"三角形的面积="<<t.area()<<endl;
cout<<fixed<<setprecision(2)<<"圆的表面积="<<c.area()<<endl;
cout<<fixed<<setprecision(2)<<"各类形状的总面积="<<s.area()+c.area()+t.area()<<endl;
return 0;
}
运行结果: