有如下程序: #include<iostream> using namespace std; class Pet{ char name[10]; public: Pet(char*name){st

admin2009-08-25  23

问题 有如下程序:
   #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()运行的是基类的版本,分别输出汪汪叫和喵喵叫。
转载请注明原文地址:https://jikaoti.com/ti/ovW0FFFM
0

最新回复(0)