填空题
有如下程序: #include<iostream> using namespace std; class A
public: virtual void f()cout<<"1"; ; class B:public A
public: B ()cout<<"2"; ; class C:public B
public: virtual void f()B::f();cout<<"3"; ; int main()
A aa,*p; B bb; C cc; p=&cc; p->f(); return 0;
执行上面程序的输出是______。
1、
【正确答案】
1、2213
【答案解析】[解析] B bb将定义一个B型对象bb,这时需调用B的构造函数,在该构造函数中,将输出"2:;C cc将定义一个C型对象cc,这时需调用C的构造函数,面该函数为缺省构造函数,其将调用父类B的构造函数,在该构造函数中,将输出"2":由于p采用指针方式调用成员函数f,而f在基类中被声明为虚拟函数,故函数f的执行与指针p所指向对象的实际类型相一致,p指向一个C型对象cc,故执行p->f()时,将执行C的f函数,在该函数中,首先直接调用了父类B的函数f,而在B中直接继承了A类的f函数,故先要执行A的f函数,输出“1”,然后再输出“3”。