有如下程序:    #include <iostream>    using namespace std;    class B {    public:        virtual void show() { cout<<"B"; }    };   

admin2009-06-20  35

问题 有如下程序:    #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;    }程序的输出结果是

选项 A、BBB
B、BBD
C、DBB
D、DBD

答案C

解析 本题考查的知识点是:虚函数与多态性。在成员函数声明的前面加上virtual修饰,即把该函数声明为虚函数。在C++中,一个基类指针(或引用)可以用于指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。题目中,fun1()和fun2()的形参分别是基类的指针和引用,如果传入的实参是指向派生类对象的指针或派生类对象,则函数中调用的show()为派生类中的show(),否则为基类中的show()。给fun1()传入的实参是指向派生类对象的指针p,而给fun2()传入的实参是基类对象。所以 fun1()调用派生类D中的show()输出一个’D’字符,fun2()调用基类B中的show()输出一个’B’字符。fun3()由于形参为基类对象,所以无论传入的是基类对象还是派生类对象,函数中调用的show()始终为基类的版本,输出一个’B’字符。故最终输出结果为 DBB,应该选择C。
转载请注明原文地址:https://jikaoti.com/ti/FTW0FFFM
0

最新回复(0)