第5章 多态性和虚函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
};
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;
void Show();
void Show() const;
private:
double x, y;
const double p;
};
void Test::Show()
{cout<<x<<","<<y<<endl;
cout<<"p="<<p<<endl;
}
void Test::Show() const
A.virtual可以用来声明虚函数
B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类
C.即使基类的构造函数没有参数,派生类也必须建立构造函数
D.静态数据成员可以通过成员初始化列表来初始化
11.有如下的程序
#include<iostream>
using namespace std;
class Base{
};
class deriveB:public base
{public:
deriveB(int x):base(x) { }
void set(int m) { n +=m; cout <<n << ' ';}
};
int main()
{
deriveA dl(1);
deriveB d2(3);
base *pbase;
A.重载函数B.虚函数C.指针D.引用
13.有如下的程序
#include<iostream>
using namespace std;
class B{
public:
virtual void show(){ cout<<"B";}
};
class D:public B{
public:
void show(){ cout<<"D";}
virtual void PrintInfo() {cout<<title<<"是"<<owner<<"的书"<<endl;}
private:
char owner[10];
};
int main(){
Book *prt=new MyBook("飘");
prt->PrintInfo();
return 0;
{Base *d1=new Derive1(1);
Base *d2=new Derive2 d2(2);
fun(d1);
fun(d2);
return 0;
}
6.请将下面的程序补充完整,使得程序运行的输出结果为:飘是张娜的书
#include<iostream>
using namespace std;
class Book{
{cout<<x<<","<<y<<" const"<<endl;
cout<<"p="<<p<<" const"<<endl;
}
intmain()
{Test a(8.9,2.5,3.1416);
a.Show();
const Test b(2.5,8.9,3.14);
b.Show();
return 0;
{
public:
A() { cout<<"A's cons."<<endl; }
virtual ~A() { cout<<"A's des."<<endl; }
virtual void f() { cout<<"A's f()."<<endl; }
void g() { f(); }
};
class B : public A{
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个类。
3.声明一个参数为整型、无返回值、名为fun1的虚函数:_______________________。
4.带有__________的类是抽象类,一个抽象类自身无法_________。
5.根据给定的程序执行结果,将下列程序补充完整。
#include <iostream>
using namespace std;
《面向对象程序设计》习题
班级:学号:姓名:成绩:____________

一、选择题(共26分,每题2分)
1.关于虚函数的描述中,()是正确的。
A.虚函数是一个静态成员函数
B.虚函数是一个非成员函数
C.虚函数既可以在函数说明时定义,也可以在函数实现时定义
D.派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型
class Base
{public:
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."<<endl;}
C.类Shape中的Draw函数声明有误
D.语句“Shape s”能够建立Shape的一个对象
4.下面4个选项中,()是用来声明虚函数的。
A.virtual B.public C.using D.false
5.关于纯虚函数和抽象类的描述中,错误的是()。
A.纯虚函数是一种特பைடு நூலகம்的虚函数,它没有具体的实现
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 <<' ';}
}
程序的运行结果是()。
A.DBD B. BBD C. DBB D. DBD
二、填空题(共24分,每空2分)
1.C++支持两种多态性,即______________和_____________。
2.在C++语言中,多态可以分为4种:包含多态、__________、__________和_________。
2.定义一个抽象类Base,包含纯虚函数display( ),派生出圆Circle类,增加数据成员radius(半径),再由Circle类派生出圆内接正方形类Incircle和圆外切正方形Outcircle类,由虚函数计算并输出求圆、圆内接正方形和圆外切正方形的面积和周长。
};
class Derive2:public Base
{public:
Derive1(int i):Base(i){}
void Print(){cout<<"Derive1's Print() called."<<endl;}
};
void fun((2)){obj->Print();}
intmain()
};
void f(Base &b){ b.fun1();b.fun2(); }
int main()
{ Derived obj;
f(obj);
return 0;
}
程序的运行结果是()。
A.BaseB.BaseC.DerivedD.Derived
BaseDerivedBaseDerived
12.下列选择中,与实现运行时多态性无关的是()。
}
三、看程序写结果(共20分,每题4分)
1.#include <iostream>
using namespace std;
class A
{public:
A(){ cout<<"A::A() called.\n"; }
virtual ~A(){ cout<<"A::~A() called.\n"; }
2.编译时的多态性可以通过使用( )获得。
A.虚函数和指针B.重载函数和析构函数C.虚函数和对象D.虚函数和引用
3.下面是类Shape的定义
Class Shape
{ public:
Virtual void Draw()=0;
};
下列关于Shape类的描述中,正确的是()。
A.类Shape是虚基类
B.类Shape是抽象类类
B.抽象类是指具体纯虚函数的类
C.一个基类中说明有纯虚函数,该基类派生类一定不再是抽象类
D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出
6.下列描述中,()是抽象类的特征。
A.可以说明虚函数B.可以进行构造函数重载
C.可以定义友元函数D.不能说明其对象
7.以下()成员函数表示虚函数。
A.virtual int vf(int);B.void vf(int)=0;
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"; }
};
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;
}
4.#include <iostream>
using namespace std;
int n=0;
class A {
int a;
public:
A(int aa=0) {a=aa; n++;}
~A() {n--;cout<<n<<endl;}
void show() {cout<<n<<endl;}
};
public:
Book(char *str) {strcpy(title,str);}
___________________________
protected:
char title[50];
};
class MyBook:public Book{
public:
MyBook(char *s1,char *s2="张娜"):_____________{strcpy(owner,s2);}
C.virtual void vf()=0;D.virtual void vf(int) { };
8.如果一个类至少有一个纯虚函数,那么就称该类为()。
A.派生类B.虚函数C.抽象类D.以上都不对
9.要实现动态联编,必须通过()调用虚函数。
A.对象指针B.成员名限定C.对象名D.派生类名
10.下面描述中,正确的是()。
intmain()
{ A a;a.show();
{ A x[2];
x[1].show();
}
a.show();
return 0;
}
5.#include <iostream>
using namespace std;
class base {
public:
int n;
base(int x) { n = x;}
};
void fun(A *a)
{ cout<<"May you succeed!"<<endl;
delete a;
}
int main()
{A *p=new B(15);
fun(p);
return 0;
}
2.#include <iostream>
using namespace std;
class A
public:
B() { f(); cout<<"B's cons."<<endl; }
~B() { cout<<"B's des."<<endl; }
};
class C : public B{
public:
C() { cout<<"C's cons."<<endl; }
~C() { cout<<"C's des."<<endl; }
void f() { cout<<"C's f()."<<endl; }
};
intmain()
{A *a=new C;
a->g();
delete a;
return 0;
}
3.#include<iostream>
using namespace std;
class Test
{public:
Test (double m,double n,double d):p(d) { x=m; y=n; }
相关文档
最新文档