您的位置:首页 > 其它

一个关于虚拟析构函数测试

2006-01-16 16:58 471 查看
#include "stdafx.h"

#include <iostream>
using namespace std;
class BaseClass
{
public:
BaseClass()
{
++nAllClassNum;
}

// virtual ~BaseClass()
// {
// --nAllClassNum;
// }
~BaseClass()
{
--nAllClassNum;
}
static int nunAllClass()
{
return nAllClassNum;
}
private:
static int nAllClassNum;//所有类的引用计数
};

class DeriveClass:public BaseClass
{
public:
DeriveClass()
{
++nDeriveClassNum;
}
~DeriveClass()
{
--nDeriveClassNum;
}
static int nunDevireClass()
{
return nDeriveClassNum;
}
private:
static int nDeriveClassNum;//派生类引用计数
};
int BaseClass::nAllClassNum=0;
int DeriveClass::nDeriveClassNum=0;
int main()
{
cout<<"一般测试:"<<endl;
BaseClass a;
cout<<"BaseClass a;->"<<"基类对象的数目:"<<BaseClass::nunAllClass()<<endl;
BaseClass b;
cout<<"BaseClass b;->"<<"基类对象的数目:"<<BaseClass::nunAllClass()<<endl;
BaseClass c;
cout<<"BaseClass c;->"<<"基类对象的数目:"<<BaseClass::nunAllClass()<<endl;
DeriveClass d;
cout<<"DeriveClass d;->"<<"基类对象的数目:"<<BaseClass::nunAllClass()<<endl;
cout<<"DeriveClass d;->"<<"基派生类对象的数目:"<<DeriveClass::nunDevireClass()<<endl;

cout<<"==============================================================="<<endl<<endl;

cout<<"基类指针测试:"<<endl;
cout<<"新建一个指向派生类的基类指针:"<<endl<<"BaseClass* pDeriveClass=new DeriveClass;"<<endl;
BaseClass* pDeriveClass=new DeriveClass;

cout<<"目前基类对象的数目 :"<<BaseClass::nunAllClass()<<endl;
cout<<"目前派生类对象的数目:"<<DeriveClass::nunDevireClass()<<endl;
delete pDeriveClass;
pDeriveClass=NULL;
cout<<"删除基类指针,注意派生类的数目没有减少,说明派生类的构造函数没有被调用"<<endl<<"delete pDeriveClass;"<<endl;;
cout<<"目前基类对象的数目 :"<<BaseClass::nunAllClass()<<endl;
cout<<"目前派生类对象的数目:"<<DeriveClass::nunDevireClass()<<endl;
cout<<"===================Test Over==============="<<endl;
return 0;
}

运行结果:一般测试:
BaseClass a;->基类对象的数目:1
BaseClass b;->基类对象的数目:2
BaseClass c;->基类对象的数目:3
DeriveClass d;->基类对象的数目:4
DeriveClass d;->基派生类对象的数目:1
===============================================================

基类指针测试:
新建一个指向派生类的基类指针:
BaseClass* pDeriveClass=new DeriveClass;
目前基类对象的数目 :5
目前派生类对象的数目:2
删除基类指针,注意派生类的数目没有减少,说明派生类的构造函数没有被调用
delete pDeriveClass;
目前基类对象的数目 :4
目前派生类对象的数目:2
===================Test Over===============

而把构造函数定义为虚拟函数
则运行结果为
一般测试:
BaseClass a;->基类对象的数目:1
BaseClass b;->基类对象的数目:2
BaseClass c;->基类对象的数目:3
DeriveClass d;->基类对象的数目:4
DeriveClass d;->基派生类对象的数目:1
===============================================================

基类指针测试:
新建一个指向派生类的基类指针:
BaseClass* pDeriveClass=new DeriveClass;
目前基类对象的数目 :5
目前派生类对象的数目:2
删除基类指针,注意派生类的数目没有减少,说明派生类的构造函数没有被调用
delete pDeriveClass;
目前基类对象的数目 :4
目前派生类对象的数目:1
===================Test Over===============
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐