1、习题四 填空题 1、联编是指一个程序模块、调用代码之间互相关联的过程。根据联编的时机不同,可以分为静态联编和( 动态联编 )。 2、包含一个或多个纯虚函数的类称为(抽象类 )。 3、虚函数应该在( 基类 )中声明,且不能在派生类中重新定义。 4、纯虚函数是( 只有函数声明而没有具体函数功能实现的虚函数)。 5、在析构函数前面加上关键字( virtual)进行说明,称该析构函数为虚析构函数。 6、如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的(析构函数 )也是虚析构函数。 7、多态性分为两类:编译时的多态性和( 运行时的多态性 ),
2、编译时的多态性是通过和( 函数 )模板实现的。 8、对虚函数的调用有两种方式:( 指针调用 )和( 对象调用 )。 9、实现编译时的多态性的机制称为(静态关联 ),实现运行时的多态性的机制称为( 动态关联 )。 10、有一种特殊的虚函数,重定义时不要求同名,这种虚函数是(虚析构函数 )。 11、模板可以实现程序设计中的( 代码重用 ),体现了面向对象程序设计的(重用性 )。 12、C++模板可以分为( 函数模板 )和(类模板 )。 13、由函数模板实例化后是( 模板函数 ),由类模板实例化后是(模板类 )。 14、模板的声明
3、使用关键字(template )。
15、已知
int sum(int n){return n+n;}
long sum(long n){return n+n;}
是一个函数模板的两个实例,则该函数模板的定义是( template
4、析构函数 D.虚函数 3、如果一个类至少有一个纯虚函数,那么该类称为( C )。 A. 虚基类 B. 派生类 C. 抽象类 D. 以上都不对 4、下列描述中,( D )是抽象类的特征。 A. 可以说明虚函数 B. 可以进行构造函数重载 C. 可以定义友元 D. 不能说明其对象 5、下列关于虚函数的描述中,( C )是正确的。 A. 虚函数是一个非成员函数 B. 虚函数是一个静态成员函数 C. 派生类的虚函数与基类种对应的虚函数具有相同的参数个数和类型 D. 虚函数既可以在函数说明时定义,也可以在函数实现时定义 6、下列关于纯虚函数与抽象类的描
5、述中,( C )是错误的。 A. 抽象类是指具有纯虚函数的类 B. 纯虚函数是一个特殊的虚函数,它没有具体的实现 C. 一个基类中说明具有纯虚函数,该基类的派生类一定不再是抽象类 D. 抽象类只能作为基类来用,其纯虚函数的实现由派生类给出 7、下列各函数的说明中,( B )表示纯虚函数。 A. virtual int vf(int); B. void vf(int)=0; C. virtual void vf()=0; D. virtual void vf(int){} 8、虚函数必须是类的( D )。 A. 友元函数 B. 构造函数 C. 析
6、构函数 D. 成员函数 9、下列关于虚函数的描述中,( A )是正确的。 A. 虚函数不能声明为另一个类的友元函数 B. 虚函数不能声明为静态成员函数 C. 派生类必须重新定义基类的虚函数 D. 如果在重定义虚函数时使用了保留字virtual,则该重定义函数仍然是虚函数 10、多态调用是指( C )。 A. 以任何方式调用一个虚函数 B. 以任何方式调用一个纯虚函数 C. 借助于指向对象的基类指针或引用调用一个虚函数 D. 借助于指向对象的基类指针或引用调用一个纯虚函数 11、在C++中,要实现动态联编,必须使用( D )调用虚函数。 A. 类名 B.
7、派生类指针 C. 对象名 D. 基类指针 12、下列函数中,可以作为虚函数的是( D )。 A. 普通函数 B. 构造函数 C. 友元函数 D. 析构函数 13、在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数返回值( B )。 A. 不同 B. 相同 C. 相容 D. 部分相同 14、假设Aclass为抽象类,下列声明( B)是正确的。 A. Aclass fun(int); B. Aclass *p; C. int fun(Aclass); D. Aclass Obj; 15、下面描述中,正确的是( D
8、 )。 A. 虚函数是没有实现的函数 B. 纯虚函数的实现只能在直接派生类中定义 C. 抽象类是只有纯虚函数的类 D. 抽象类指针可以指向不同的派生类 16、当运行程序时实际上是将类模板实例化为一个具体的( D )。 A. 类 B. 对象 C. 函数 D. 模板类 17、模板函数的真正代码是在( C )时产生的。 A. 源程序中声明函数时 B. 源程序中定义函数时 C. 源程序中调用函数时 D. 运行执行函数时 18、类模板的模板参数( D )。 A. 只可作为数据成员的类型 B. 只可作为成员的返回值类型 C. 只可作为成员函数的
9、参数类型 D. 以上三者皆可
19、以下关于模板的叙述中,不正确的是( C )。
A. 用模板定义一个对象时不能省略参数
B. 类模板只能有虚拟参数类型
C. 类模板的成员函数都是模板函数
D. 类模板本身在编译中不会生成任何代码
20、如果有如下函数模板的定义:
template
10、C++中,要实现动态联编,可以使用基类指针调用虚函数。√
2、构造函数可以作为虚函数使用。N
3、虚函数是没有实现的函数。N
4、在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数返回值部分相同。N
5、抽象类是只有纯虚函数的类。N
6、构造函数可以作为虚函数。N
7、纯虚函数是一个特殊的虚函数,它没有具体的实现。√
8、虚函数的声明需要使用关键字protected。N
9、设置虚函数的目的是为了消除二义性。N
10、抽象类只能作为基类使用,其纯虚函数的实现由派生类来完成。√
分析题
1、
#include
11、ass A
{
public:
A()
{
cout< 12、
cout< 13、cout<<"Execting shape dtor"< 14、e: int x;
public: Base(int a=0) { x=a; }
virtual void fun() { cout<<"Base fun"< 15、d() { cout<<"~Derived"< 16、0;}
};
void main()
{
Derived d;
Base&b=d;
cout< 17、ss derive2:public base
{
public:
void who()
{cout<<"derive2 class3"< 18、namespace std;
class Base{
char base_name[20];
public:
Base(){strcpy(base_name,"BASE");}
virtual char*my_name(){return base_name;}
char*class_name(){return base_name;}
};
class Derived:public Base{
char derived_name[20];
public:
Derived(){strcpy(derived_name,"DERIVED 19、");}
char*my_name(){return derived_name;}
char*class_name(){return derived_name;}
};
void show_ptr(Base*p)
{
cout< 20、 cout< 21、
cout<<"<==应显示'ABCD EFG'";
return 0;
}
7、
#include 22、
{
public:
Sphere(double radius=0):Circle(radius){}
double Area(){ return 4*PI*r*r;}
double Volume(){ return 4*PI*pow(r,3)/3; }
};
class Cylinder:public Circle
{
double h;
public:
Cylinder(double radius=0,double height=0):Circle(radius)
{ h=height; }
double Area(){ return 2*PI*r 23、r+h); }
double Volume(){ return PI*r*r*h; }
};
class Cone:public Circle
{
double h;
public:
Cone(double radius=0,double height=0):Circle(radius)
{ h=height; }
double Area()
{
double l=sqrt(h*h+r*r);
return PI*r*r*(r+l);
}
double Volume()
{
return PI*r*r*h/3;
}
} 24、
void Output(Circle*b[],int n)
{
for(int i=0;i 25、)
return x;
else
return y;
}
void main()
{
int n1=2,n2=8;
double d1=2.3,d2=5.6;
cout< 26、5,17};
cout< 27、实现每个人的月工资。要求利用纯虚函数实现。
3、编程计算圆形(Circle)和正方形(Square)的周长和面积。要求定义一个抽象类,其中包括求周长(per)和面积(area)的纯虚函数,然后在此基类的基础上,派生出圆形类和正方形类,主函数通过基类的指针调用各派生类的函数。
4、用函数模板实现求两个整数、两个浮点数和两个字符中的最小值。
5、定义一个类模板input,在调用构造函数时,完成的工作包括:提示用户输入;让用户输入数据;如果用户输出数据不在预定范围内,提示重新输入。
习题答案
一、 填空题
1、动态联编
2、抽象类
3、基类
4、只有函数声明而没有具体函数功能实现的 28、虚函数。
5、virtual
6、析构函数
7、运行时的多态性 ,函数
8、指针调用 ,对象调用
9、静态联编 ,动态联编
10、虚析构函数
11、代码重用 ,可重用性
12、函数模板 ,类模板
13、模板函数,模板类
14、template
15、template 29、判断题
1、√ 2、× 3、× 4、× 5、× 6、× 7、√ 8、× 9、× 10、√
四、 分析题
1、
实例化类A的一个对象。
实例化类A的一个对象。
实例化类B的一个对象。
----------
执行类A的成员函数。
执行类B的成员函数。
----------
执行类B的成员函数。
----------
消除类B的一个对象。
消除类A的一个对象。
消除类A的一个对象。
2、
Execting Circle dtor
Execting shape dtor
3、
Derived fun
~Derived
~Base
4、
80
10
5 30、
base class1
derive1 class2
derive2 class3
derive1 class2
derive2 class3
6、
BASEBASE<==应显示'ABCD EFG'
DERIVEDBASE<==应显示'DERIVED EFG'
BASEBASE<==应显示'ABCD EFG'
DERIVEDBASE<==应显示'DERIVED EFG'
BASEBASE<==应显示'ABCD EFG'
7、
50.24 33.4933
62.8 37.68
70.4057 12.56
8、
2 2.3
31、
9、
25
五、编程题
1、
#include 32、blic RQ
{
private:
float A,B,C;
public:
CFT(float a,float b,float c){A=a;B=b;C=c;}
float calTJ(){return A*B*C;}
void display(){cout<<"长方体体积为"< 33、iostream.h>
class Employee
{
public:
virtual double earn()=0;
virtual void print()=0;
};
class Manager:public Employee
{
private:
double msalary;
public:
Manager(double ms){msalary=ms;}
double earn(){return msalary;}
void print(){cout<<"主管月工资为:"< 34、orker:public Employee
{
private:
double wage;
int hours;
public:
Hworker(double w,int h){wage=w;hours=h;}
double earn(){return 2500+hours*50;}
void print(){cout<<"员工加班"< 35、
p->print();
p=&h1;
p->print();
}
3、
#include "iostream.h"
#include "math.h"
const double PI=3.14;
class Shape
{
public:
virtual void GetPerimeter()=0;
virtual void GetArea()=0;
protected:
double per;
double area;
};
class Circle:public Shape
{
double Radius;
public:
Cir 36、cle(double r) { Radius=r; }
void GetPerimeter()
{
per=2*PI*Radius; cout<<"Circle's perimeter:"< 37、
void GetPerimeter()
{
per=4*length; cout<<"Square's perimeter:"< 38、>GetArea();
}
4、
#include






