有如下程序: #include #include using namespace std; class Publication{ public: Publication(string n="Unknown")

admin2017-02-18  24

问题 有如下程序:
    #include
    #include
    using namespace std;
    class Publication{
    public:
    Publication(string n="Unknown"):name(n){}
    const string getName()const{return name;}
    virtual const string getType()const{return"Unknown";}
    private:
    string name;
    };
    class Book:public Publication{
    public:
    Book(string name):Publication(name){}
    virtual const string getType()const{return"Book";}
    };
    void showPublication(Publication&p){
    cout<    }
    int main(){
    Book book("C++");
    showPublication(book);
    return 0;
    }
运行时的输出结果是(    )。

选项 A、Book:C++
B、Book:Unknown
C、Unknown:C++
D、Unknown:Unknown

答案A

解析 C++中,多态调用必须满足两个条件:被调用的成员函数是虚函数;必须通过基类类型的引用或指针进行函数调用。
    题意的main()函数中首先定义一个Book类对象,对象名为book,在构造book对象时,程序过程如下:首先调用Book类的构造函数,传入参数“C++”,在构造函数执行函数体前,再调用基类Publication的默认构造函数:传入字符串“C++”,基类构造函数在成员初始化列表中,使用传入的参数“C++”为name赋值;此时继承于基类的成员:name存放字符串“C++”。
    然后main()函数调用showPublication()函数,传入book对象:showPublication()函数接收Publication类对象的引用p,然后调用p.getType()和p.getName()输出。由于getType()成员函数属于虚函数,p属于基类对象的引用,所以通过p调用getType()函数满足多态调用,执行p实际引用对象类型的getType(),即Book类的getType(),输出:“Book”;而getName()不是成员函数,所以不满足多态调用,执行基类的成员函数getName(),输出name:“C++”。综上,程序输出:Book:C++。本题答案为A选项。
转载请注明原文地址:https://jikaoti.com/ti/hkt0FFFM
0

最新回复(0)