有如下程序: #include<iostream> using namespace std; class base { public: virtual void f1() {

admin2010-03-29  24

问题 有如下程序:     #include<iostream>     using namespace std;     class base     {     public:        virtual void f1()        {          cout<<"F1Base";      }      virtual void f2()      {         cout<<"F2Base  ";      }    };    class derive : public base    {         void f1 ( )         {              cout<<"F1Derive";         }         void f2( int x )         {              cout<<"F2 Derive";         }    };    int main ()    {          base objl,  * p;          derive obj2;          p = & obj2;          p -> f1();          p -> f2();          return 0;    }    执行后的输出结果是(   )。

选项 A、F1Derive   F2Base
B、F1Derive  F2Derive
C、F1Base  F2Base
D、F1Base   F2Derive

答案1

解析 本题主要考察C++中虚函数机制及其继承过程中的要点。虚函数在基类中加关键词virtual声明,在派生类中重新定义。如果派生类没有覆盖虚函数,则程序执行中将会执行基类的虚函数版本。
   本题程序中,建立了基类base,其内函数void f1()和void f2()均被声明为虚函数,并在调用时会显式地发出声明。派生类derive利用public方式继承基类base,并覆盖其基类base中的虚函数f1()。对于base中的虚函数f2(),由于派生类derive中的同名函数f2()中带有参数int x,因此被编译器认为是函数重载,而不作虚函数覆盖处理,所以实际上派生类derive中包含两个f2()函数,一个不带参数,调用时执行基类base中的f2()函数版本,一个带参数int x,调用时执行重载后的版本。
   本题主函数中,定义了基类对象。obj1和基类指针*p,同时定义了派生类对象。obj2。
   p指向obj2时,“p->n()”函数调用执行派生类覆盖后的版本,输出F1Derive;“p-> f2()”由于不带参数,因此执行未经派生类覆盖的函数版本,即基类base中的f1()函数版本。
转载请注明原文地址:https://jikaoti.com/ti/9xW0FFFM
0

最新回复(0)