选择题
有如下程序:
#include<iostream>
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;
}
程序的输出结果是______。
【正确答案】
C
【答案解析】此题考查的是虚函数与多态性。在成员函数的声明前面加上virual关键字,即可把函数声明为虚函数;在C++中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。此题中,fun1()和fun2()的形参分别是基类的指针和引用,给fun1()传入的实参是指向派生类对象的指针p,fun1()将调用D类中的show()输出字符‘D’;给fun2()出入的实参是基类对象,fun2()调用类B中的show()输出字符‘B’;fun3()由于形参是基类对象,调用的始终都是基类的show(),输出字符‘B’。故最终输出结果是DBB。