第5章多态性
一、单选题(共17题,100分)
1下列有关继承和派生的叙述中,正确的是( )
A. 派生类不能访问基类的保护成员
B. 作为虚基类的类不能被实例化
C.派生类应当向基类的构造函数传递参数
D.虚函数必须在派生类中重新实现
我的答案: C正确答案: C
答案解析:答案解析 解析派生类可以访问基类的保护成员,而不能访问基类的私有成员。作为虚基类的类可以被实例化。虚函数如果没有派生类中重新实现,那么仍然使用基类的成员函数
2有如下类定义: class Shape{ public: 【1】 //纯虚函数Draw的声明 }; 程序中【1】处缺失的纯虚函数Draw的声明是( )。
A.void Draw()=0;
B.virtual void Draw()=0;
C.virtual void Draw(){ }
D. virtual void Draw(int=0);
我的答案: B正确答案: B
答案解析:在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。一般形式如下:
class <类名>
{
virtual <类型> <函数名>(<参数表>)=0;
…
};
所以B选项正确。
3有如下程序:
#include <iostream>
using namespace std;
class Book {
public:
Book(char* t=" ") { strcpy(title,t); }
【1】
private:
char title[40];
};
class Novel : public Book {
public:
Novel(char* t=" "): Book(t) { }
char* Category()const { return "文学"; }
};
int main() {
Book *pb;
pb=new Novel();
cout<<pb->Category();
delete pb;
return 0;
}
若程序运行时输出结果是"文学",则程序中【1】处缺失的语句是( )。
A.char* Category();
B.char* Category()const;
C.virtual char* Category()const;
D. virtual char* Category()const=0;
我的答案: D正确答案: D
答案解析:本题考查纯虚函数和抽象类,纯虚函数是在声明虚函数时被"初始化"为0的函数,包含纯虚函数的类为抽象类,抽象类是不能被实例化的,但是可以定义指向抽象类数据的指针变量,当派生类成为具体类后,就可以用这种指针指向派生类的对象,然后通过该指针调用虚函数,实现多态性的操作。所以本题答案为D。
4.有如下程序:
#include<iostream>
using namespace std;
class GA {
public:
virtual int f() { return 1; }
};
class GB: public GA {
public:
virtual int f() { return 2; }
};
void show(GA g) { cout<<g.f(); }
void display(GA &g) { cout<<g.f(); }
int main()
{
GA a; show(a); display(a);
GB b; show(b); display(b);
return 0;
}
执行这个程序的输出结果是( )。
A.1111
B.1211
C.1112
D.1212
我的答案: C正确答案: C
5.8分
答案解析:本题主要考查虚函数。虚函数指在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,本题中定义类GA的对象a,执行show(a)、display(a),输出11,定义了类GB的对象b,执行show(b),仍然输出1,display(b)执行会调用