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
- 360 2016校招笔试-读代码题
- 2016 360校招笔试编程题
- 2016年360校招笔试题
- 360校招笔试题
- 校招笔试题
- 360校招笔试算法题
- 2015年360校招笔试题
- 腾讯2016校招笔试题
- 2016小米校招笔试题
- 腾讯2016校招笔试题
- 微软2016校招笔试题
- 腾讯2016校招笔试题
- 2016微软校招笔试题
- 2016CVTE校招在线笔试题
- 腾讯2016校招笔试
- 一些校招笔试题
- 人人校招笔试题
- 淘宝校招笔试题
- 拍照后压缩、 在相册中选取照片
- iOS_使用UIBezierPath对象实现视图控件的立体阴影效果和半透明背景效果
- UVALive7008
- 自定义异常,并将异常对象写入文件
- jsp中四个作用域的区别
- 360 2016校招笔试-读代码题
- android获取当前焦点的位置,查找焦点的位置
- iOS中的三种定时器使用方法
- 如何卸载ubantu自带的jdk
- uva 232 - Crossword Answers
- 错误代码: 1109 Unknown table 'ename' in MULTI DELETE
- iOS疯狂讲解之SQLite语句
- ASP.NET MVC 入门介绍 (上)
- java线程的同步方式