有如下程序: #include<iostream> using namespace std; class Pet{char name[10]; public:Pet(char*name){strcpy(this->name,name);}const char*getName()const {return name;}virtual void call()const=0; }; class Dog:public Pet{ public:Dog(char*name):Pet(name){}void call()const{cout<<"汪汪叫":} }; class Cat:public Pet{ public:Cat(char*name):Pet(name){}void call()const{cout<<"喵喵叫";} }; int main(){Pet*pet1=new Dog("哈克"),*pet2=new Cat("吉米");cout<<pet1->getName();pet1->call();cout<<end1;cout<<pet2->getName();pet2->call();cout<<end1;return 0; } 程序的输出结果是______。
参考答案:哈克汪汪叫
解析:吉米喵喵叫 此题考查的是虚函数与多态性。在成员函数的声明前面加上virual关键字,即可把函数声明为虚函数;在C++中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。即若基类和派生类中存在一模一样的成员函数,通过该基类指针调用这样的成员函数时,若这个成员函数被定义成虚函数,那么就调用派生类中的;否则就调用基类中的。本题中,在f()函数中,此题中,void call()在基类中被声明为虚函数,在主函数中,语句Pet*pet1=new Dog("哈克"),*pet2=new Cat("吉米");定义了基类的指针per1和pet2,并让它们分别指向派生类对象Dog和Cat。所以通过该指针调用call()时运行的是派生类的版本,分别输出哈克和吉米;而通过该指针调用 getName()运行的是基类的版本,分别输出汪汪叫和喵喵叫。