第5章 多态性和虚函数
《面向对象程序设计》习题
班级:学号:姓名:成绩:____________
第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. 下面描述中,正确的是()。
A.virtual可以用来声明虚函数
B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类
C.即使基类的构造函数没有参数,派生类也必须建立构造函数
D.静态数据成员可以通过成员初始化列表来初始化
11. 有如下的程序
#include
using namespace std;
class Base{
public:
void fun1(){cout<<"Base\n"; }
virtual void fun2(){ cout<<"Base\n";}
};
class Derived:public Base{
public:
void fun1(){ cout<<"Derived\n"; }
void fun2(){cout<<"Derived\n"; }
};
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. 指针
D. 引用
13. 有如下的程序
#include
using namespace std;
class B{
public:
virtual void show(){ cout<<"B";}
};
class D:public B{
public:
void show(){ cout<<"D";}
};
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;
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
using namespace std;
class Base
{public: Array Base(int i) {b=i;}
(1)
protected:
int b;
};
class Derive1:public Base
{public:
Derive1(int i):Base(i){}
void Print(){cout<<"Derive1's Print() called."< }; class Derive2:public Base { public: Derive1(int i):Base(i){} void Print(){cout<<"Derive1's Print() called."< }; void fun((2)){ obj->Print();} int main() { B ase *d1=new Derive1(1); Base * d2=new Derive2 d2(2); fun(d1); fun(d2); return 0; } 6. 请将下面的程序补充完整,使得程序运行的输出结果为:飘是张娜的书 #include 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="张娜"):_____________{strcpy(owner,s2);} virtual void PrintInfo() {cout< char owner[10]; }; int main(){ Book *prt=new MyBook("飘"); prt->PrintInfo(); return 0; } 三、看程序写结果(共20分,每题4分) 1.#include using namespace std; class A {public: A(){ cout<<"A::A() called.\n"; } virtual ~A(){ cout<<"A::~A() called.\n"; } }; class B:public A {public: B(int i) { cout<<"B::B() called.\n"; buf=new char[i]; } virtual ~B() { delete []buf; cout<<"B::~B() called.\n"; } private: char *buf; }; void fun(A *a) { cout<<"May you succeed!"< delete a; } int main() { A *p=new B(15); fun(p); return 0; } 2.#include using namespace std; class A { public: A() { cout<<"A's cons."< virtual ~A() { cout<<"A's des."< virtual void f() { cout<<"A's f()."< void g() { f(); } }; class B : public A{ public: B() { f(); cout<<"B's cons."< ~B() { cout<<"B's des."< }; class C : public B{ public: C() { cout<<"C's cons."< ~C() { cout<<"C's des."< void f() { cout<<"C's f()."< }; int main() {A *a=new C; a->g(); delete a; return 0; } 3.#include using namespace std; class Test {public: Test (double m,doublen,double d):p(d) { x=m; y=n; } void Show(); void Show() const; private: double x, y; const double p; }; void Test::Show() { cout< cout<<"p="< } void Test::Show() const { cout< cout<<"p="< } intmain() {Test a(8.9,2.5,3.1416); a.Show(); const Test b(2.5,8.9,3.14); b.Show(); return 0; } 4. #include using namespace std; int n=0; class A { int a; public: A(intaa=0) {a=aa; n++;} ~A() {n--;cout< void show() {cout< int main() { A a; a.show(); { A x[2]; x[1].show(); } a.show(); return 0; } 5. #include using namespace std; class base { public: int n; base(int x) { n = x;} virtual void set(int m) { n = m; cout<< n <<' ';} }; class deriveA:public base { public: deriveA(int x):base(x) { } void set(int m) { n += m; cout<< n <<' ';} }; class deriveB:public base {public: deriveB(int x):base(x) { } void set(int m) { n +=m; cout< }; int main() { deriveA dl(1); deriveB d2(3); base *pbase; pbase = &dl; pbase->set(1); pbase = &d2; pbase->set(2); return 0; } 五、编程题(共30分) 1.设计一个基类Base为抽象类,其中包含setTitle和printTitle两个成员函数,另有一个纯虚函数isGood。由该类派生出图书类Book和杂志类Journal,分别实现纯虚函数isGood。对于前者,如果每月图书销售量超过500,则返回true;对于后者,如果每月杂志销售量超过2500,则返回true。设计这3个类。 2.定义一个抽象类Base,包含纯虚函数display( ),派生出圆Circle类,增加数据成员radius (半径),再由Circle类派生出圆内接正方形类Incircle和圆外切正方形Outcircle类,由虚函数计算并输出求圆、圆内接正方形和圆外切正方形的面积和周长。