第5章 多态性和虚函数

第5章 多态性和虚函数
第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类,由虚函数计算并输出求圆、圆内接正方形和圆外切正方形的面积和周长。

相关主题
相关文档
最新文档