单选题
1分
有如下程序: #include<iostream> #include<string>...
有如下程序:
#include<iostream>
#include<string>
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<<p.getType()<<":"<<p.getName()<<endl;
}
int main(){
Book book("C++");
showPublication(book);
return 0;
}
运行时的输出结果是( )。
#include<iostream>
#include<string>
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<<p.getType()<<":"<<p.getName()<<endl;
}
int main(){
Book book("C++");
showPublication(book);
return 0;
}
运行时的输出结果是( )。
参考答案: A
参考解析: 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选项。