弱问个析构函数的问题
此程序
#include <iostream>
#include <string >
using namespace std;
class Thing
{
public:
virtual void what_Am_I( )
{
cout << "I am a Thing.\n";
}
~Thing()
{
cout<<"Thing destructor"<<endl;
}
};
class Animal : public Thing
{
public:
virtual void what_Am_I( )
{
cout << "I am an Animal.\n";
}
~Animal()
{
cout<<"Animal destructor"<<endl;
}
};
void main( )
{
Thing t ;
Animal x ;
Thing* array[2];
array[0] = &t; // base pointer
array[1] = &x;
for (int i=0; i<2; i++)
array[i]->what_Am_I( ) ;
return ;
}
的运行结果为:
I am a Thing.
I am an Animal.
Animal destructor
Thing destructor
Thing destructor
就是析构函数调用不太明白,数组元素是先删除array[1]吗?
非常感谢
[解决办法]
如果有继承,一般建议基类的析构函数为虚函数
[解决办法]
跟数组没关系,是按照这两个对象定义逆序析构的。
Thing t ;
Animal x ;
难道你们老师没教你什么叫 “压栈” “出栈” ?
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。