360 2016校招笔试-读代码题

给如下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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值