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