Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7194084
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: C/C++

2006-06-20 12:08:25

在C++中,构造函数的次序 按照 基类、成员类
,当前类类的次序进行构造,析构是正好相反。注意 这里是强调的当前类的对象的构造和析构过程。在程序中,如果是临时变量,也就是栈里面的的变量,系统会自动按照这个规律进行。但对于当动态构造的对象,比如new,最后再用delete删除对象,未必按照上面的那个次序进行,比如用基类的指针delete时候,此时是按照基类删除的。和当前类没关系,也就是当前类的析构函数没有被调用。显然这是由于向上影射造成的,解决的方法自然是想到了虚函数。只要把析构函数设置为虚函数。就可以解决这个问题。这个分析可以参看后面的例子。
 
#include
using namespace std;
class CBase
{
public:
 CBase()
 {
  data = new char[64];
  cout<<"cbase 构造"< };
 ~CBase()
 {
  delete [] data;
  cout<<"cbase 析造"< };
 char *data;
};
class CFunction
{
public:
 CFunction()
 {
  cout<<"CFunction 构造"< };
 virtual ~CFunction()//虚函数
 {
  cout<<"CFunction 析造"< };
};
class CFunctionEx : public CFunction
{
public:
 CFunctionEx(){
cout<<"CFunctionEx 构造"< };
 ~CFunctionEx(){
  cout<<"CFunctionEx 析造"< };
private:
 CBase m_cbase;
};
void main()
{
 CFunction *pCFun = new CFunctionEx;
 delete pCFun;
 //CFunctionEx *pCFun = new CFunctionEx;
 //CFunctionEx g;
}
 
输出结果:
CFunction 构造
cbase 构造
CFunctionEx 构造
CFunctionEx 析造
cbase 析造
CFunction 析造
 
如果CFunction不是虚函数,则输出
CFunction 构造
cbase 构造
CFunctionEx 构造
CFunction 析造

 
阅读(2461) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-11-17 09:48:55

好东西