《面向对象程序设计》习题
班级:学号:姓名:成绩:____________
第5章多态性和虚函数
一、选择题(共26分,每题2分)
1.关于虚函数的描述中,()是正确的。
A. 虚函数是一个静态成员函数
B. 虚函数是一个非成员函数
C. 虚函数既可以在函数说明时定义,也可以在函数实现时定义
D. 派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型 2.编译时的多态性可以通过使用( )获得。
A.虚函数和指针B.重载函数和析构函数C.虚函数和对象 D.虚函数和引用 3.下面是类Shape的定义 Class Shape { public:
Virtual void Draw()=0; };
下列关于Shape类的描述中,正确的是()。 A.类Shape是虚基类 B.类Shape是抽象类类
C.类Shape中的Draw函数声明有误
D.语句“Shape s”能够建立Shape的一个对象 4. 下面4个选项中,()是用来声明虚函数的。
A.virtual B.public C.using D.false 5. 关于纯虚函数和抽象类的描述中,错误的是()。
A.纯虚函数是一种特殊的虚函数,它没有具体的实现 B.抽象类是指具体纯虚函数的类
C.一个基类中说明有纯虚函数,该基类派生类一定不再是抽象类 D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 6. 下列描述中,()是抽象类的特征。
A.可以说明虚函数B.可以进行构造函数重载 C.可以定义友元函数D.不能说明其对象 7. 以下()成员函数表示虚函数。
A.virtual intvf(int); B.void vf(int)=0;
C.virtual void vf()=0; D.virtual void vf(int) { }; 8. 如果一个类至少有一个纯虚函数,那么就称该类为()。 A.派生类 B.虚函数C.抽象类D.以上都不对 9. 要实现动态联编,必须通过()调用虚函数。
A.对象指针 B.成员名限定 C.对象名 D.派生类名 10. 下面描述中,正确的是()。
1
A.virtual可以用来声明虚函数
B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类 C.即使基类的构造函数没有参数,派生类也必须建立构造函数 D.静态数据成员可以通过成员初始化列表来初始化 11. 有如下的程序
#include
class Derived:public Base{ public: void fun1(){ cout<<\} void fun2(){cout<<\};
void f(Base &b){ b.fun1();b.fun2(); } int main()
{ Derived obj; f(obj); return 0; }
程序的运行结果是()。
A.BaseB.Base C.Derived D.Derived
BaseDerived Base Derived
12. 下列选择中,与实现运行时多态性无关的是()。
A. 重载函数 B. 虚函数 C. 指针 13. 有如下的程序
#include
class D:public B{ public: void show(){ cout<<\};
void fun1(B *ptr){ ptr->show(); } void fun2(B &ref){ ref.show(); } void fun3(B b){ b.show(); } int main()
{ B b,*p=new D;
2
D. 引用 D d; fun1(p); fun2(b); fun3(d); return 0; }
程序的运行结果是()。
A. DBD B. BBD C. DBB D. DBD
二、填空题(共24分,每空2分)
1.C++支持两种多态性,即______________和_____________。
2.在C++语言中,多态可以分为4种:包含多态、__________、__________和_________。 3. 声明一个参数为整型、无返回值、名为fun1的虚函数:_______________________。 4. 带有__________的类是抽象类,一个抽象类自身无法_________。 5.根据给定的程序执行结果,将下列程序补充完整。
#include
程序的执行结果如下: Base(int i) {b=i;}
Derive1's Print() called. (1)
Derive2's Print() called. protected:
int b; };
class Derive1:public Base {public:
Derive1(int i):Base(i){}
void Print(){cout<<\};
class Derive2:public Base { public:
Derive1(int i):Base(i){}
void Print(){cout<<\};
void fun( (2) ){ obj->Print();} int main() { Base *d1=new Derive1(1);
Base * d2=new Derive2 d2(2); fun(d1); fun(d2);
return 0; }
6. 请将下面的程序补充完整,使得程序运行的输出结果为:飘是张娜的书 #include
3
using namespace std; class Book{ public:
Book(char *str) {strcpy(title,str);} ___________________________ protected:
char title[50]; };
class MyBook:public Book{ public:
MyBook(char *s1,char *s2=\张娜\virtual void PrintInfo() {cout<
char owner[10]; };
int main(){
Book *prt=new MyBook(\飘\ prt->PrintInfo(); return 0; }
三、看程序写结果(共20分,每题4分)
1.#include
A(){ cout<<\ }
virtual ~A(){ cout<<\ } };
class B:public A {public: B(int i)
{ cout<<\buf=new char[i]; }
virtual ~B() { delete []buf;
cout<<\ }
private:
char *buf; };
void fun(A *a)
{ cout<<\
4
delete a; }
int main()
{ A *p=new B(15); fun(p); return 0; }
2.#include
using namespace std; class A {
public:
A() { cout<<\
virtual ~A() { cout<<\ virtual void f() { cout<<\void g() { f(); } };
class B : public A{ public:
B() { f(); cout<<\~B() { cout<<\};
class C : public B{ public:
C() { cout<<\~C() { cout<<\void f() { cout<<\};
int main() {A *a=new C; a->g(); delete a; return 0; }
3.#include
class Test {public: Test (double m,doublen,double d):p(d) { x=m; y=n; }
void Show();
void Show() const; private:
5