360 2016校招笔试-读代码题

来源:互联网 发布:mysql查询系统表 编辑:程序博客网 时间:2024/05/29 11:00

给如下C++代码:

#include <iostream>using namespace std;class CBase{    public :         CBase(){cout<<"CBase Constructor!"<<endl;fun();}        ~CBase(){cout<<"CBase Deconstuctor!"<<endl;fun();}    public:    virtual void fun(){cout<<"CBase::fun()"<<endl;}};class CDerived:public CBase{    public :          CDerived(){fun();cout<<"CDerived Constructor!"<<endl;}          ~CDerived(){cout<<"CDerived Deconstructor!"<<endl;fun();}    public:    virtual void fun(){cout<<"CDerived::fun()"<<endl;}};int main(){    CBase* p = new CDerived;    delete p;    return 0;}

判断该程序运行后的输出;

自己笔试完后,编译运行后的结果如下:


结果有点超乎自己的预期,好吧,至于为什么为输出这样的结果,容我再想想。或者你知道,也可以留言给我!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这儿写下自己的理解吧,

首先

new CDerived;
创建一个CDerived对象,先调用基类CBase构造函数初始化基类对象再调用派生类CDerived构造函数初始化派生类对象,这个很好理解;然后在调用基类构造函数的时候调用的fun()函数是CBase::fun(),这也好理解,毕竟此时是通过基类对象调用的;最后调用派生类CDerived构造函数时调用的fun()函数是CDerived::fun(),这就是虚函数多态了,此时通过派生类CDerived对象调用;

其次

delete p;

该语句用于回收指针p所指向的内存空间,由于p被声明为指向CBase的指针,因此系统会按照CBase对象所占的空间进行收回,在收回之前,会调用CBase对象的析构函数,但不会调用CDerived对象的析构函数,于是就输出了如上结果。

如果如下声明指针p,则会调用CDerived对象的析构函数

 CDerived* p = new CDerived;


                                             
0 0
原创粉丝点击