为什么会得出这结果???????求祥解

zengshensz 2007-04-27 10:02:18
#include <stdio.h>
class Value
{
public:Value(int nVal)
{
m_nVal = nVal;
printf("Call Value::Value(int nValue)\n");
}
~Value()
{
printf("1Call Value::~Value()\n");
}
Value & operator =(int nVal)
{
m_nVal = nVal;
printf("1Call Value::operator = \n");
return *this;
}
void Dump()
{
printf("1Value::m_nVal = %d\n", m_nVal);
}
protected:int m_nVal;
};

class Base
{
public:Base()
{
Init();
}
virtual ~Base()
{
Release();
}
virtual void Init()
{
printf("2Call Base::Init()\n");
}
virtual void Release()
{
printf("2Call Base::Release()\n");
}
virtual void Dump()
{
printf("2Call Base::Dump()\n");
}
};
class Derive : public Base
{
public:Derive()
{
printf("3Call Derive::Derive()\n");
}
~Derive()
{
printf("3Call Derive::~Derive()\n");
}
virtual void Init()
{
m_Val = 2; printf("3Call Derive::Init()\n");
}
virtual void Release()
{
printf("3Call Derive::Release()\n");
}
virtual void Dump()
{
m_Val.Dump();
}
protected:static Value m_Val;
};
Value Derive::m_Val = 0;
void DestroyObj(Base* pOb)
{
pOb->Dump();
delete pOb;
}
void main()
{
Derive* pOb = new Derive;
DestroyObj(pOb);
}

输出结果:
Call Value::Value(int nValue)
Call Base::Init()
Call Derive::Derive()
Value::m_nVal=0
Call Derive::~Derive()
Call Base::Release()
Call Value::~Value()
...全文
263 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyo_alex_lw 2007-04-27
  • 打赏
  • 举报
回复
全局变量,类静态变量在程序进入main之前就已经初始化.因此第一句是Call Value::Value(int nValue).语句Derive* pOb = new Derive;时,首先调用基类构造函数,然后调用子类构造函数,否则就有可能输出子类在构造时需要用到基类定义的数据,而该数据还没有构造,会出现异常.因此必须必须如此.在析构时,则必须先析构子类,不然要是先析构基类,可能造成子类数据无法析构的问题.还有一个问题是在基类构造函数中调用虚函数的问题,即使子类重载了该函数,在构造基类对象时,不会调用子类的重载函数,因为基类不知道是那个子类重载了.因此基类构造函数调用虚函数没有什么意义.因此输出"2Call Base::Init()",从输出"Value::m_nVal=0"也可以看出m_nVal不等于2,也证明了基类构造时,不调用虚函数的重载实现.
5zero 2007-04-27
  • 打赏
  • 举报
回复
static Value m_Val,静态成员第一个初始化
构造时候从底层(基类)开始构造,
析构时候从高层(派生类派生部分)开始析构
  • 打赏
  • 举报
回复
static Value m_Val,静态成员在内存中只有一份,在程序的最开头执行初始化
其他的对象构造顺序是按基类,非静态成员对象,派生类
构造顺序相反
lidongri 2007-04-27
  • 打赏
  • 举报
回复
m_Val 是一个静态成员变量,在对象调用构造函数之前被初始化
jixingzhong 2007-04-27
  • 打赏
  • 举报
回复
构造时候从底层(基类)开始构造,
析构时候从高层(派生类派生部分)开始析构
xlbdan 2007-04-27
  • 打赏
  • 举报
回复
static Value m_Val,静态成员第一个初始化

然后是基类,成员类对象,子类.

析构顺序相反
drin82 2007-04-27
  • 打赏
  • 举报
回复
Derive::m_Val 是一个静态成员变量,它会在对象调用构造函数之前被初始化
zasdfaaa 2007-04-27
  • 打赏
  • 举报
回复
mark

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧