返回信息流//**************************** programe 1 *******************************
#include "stdafx.h"
#include <iostream.h>
class Base
{
public:
virtual ~Base() { cout<< "~Base" << endl ; }
};
class Derived : public Base
{
public:
virtual ~Derived() { cout<< "~Derived" << endl ; }
};
void main(void)
{
Base * pB = new Derived; // upcast
delete pB;
}
输出:(很容易理解)
~Derived
~Base
//**************************** programe 2 *******************************
#include "stdafx.h"
#include <iostream.h>
class Base
{
public:
~Base() { cout<< "~Base" << endl ; }
};
class Derived : public Base
{
public:
~Derived() { cout<< "~Derived" << endl ; }
};
void main(void)
{
Base * pB = new Derived; // upcast
delete pB;
}
输出:(也很容易理解,因为隐藏机制)
~Base
//**************************** programe 3 *******************************
#include "stdafx.h"
#include <iostream.h>
class Base
{
public:
~Base() { cout<< "~Base" << endl ; }
};
class Derived : public Base
{
public:
virtual ~Derived() { cout<< "~Derived" << endl ; }
};
void main(void)
{
Base * pB = new Derived; // upcast
delete pB;
}
输出:
~Base
然后程序崩溃
求大牛解释为何programe3最后崩溃,感激涕零!
这是一条镜像帖。来源:北邮人论坛 / cpp / #46540同步于 2010/11/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
析构函数征婚 求大牛 解惑
jackbupt
2010/11/21镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我怎么记得析构函数不能为虚函数来着……
【 在 jackbupt (jackbupt) 的大作中提到: 】
: //**************************** programe 1 *******************************
: #include "stdafx.h"
: #include <iostream.h>
: ...................
都说一般情况下,应该将析构函数定义为虚函数
【 在 renne 的大作中提到: 】
: 我怎么记得析构函数不能为虚函数来着……
: 【 在 jackbupt (jackbupt) 的大作中提到: 】
: : //**************************** programe 1 *******************************
: ...................
首先,谢谢答复。请问为何programe 2却不坏,不崩溃?
【 在 a206206 的大作中提到: 】
: 明明调用的base的析构函数,指向的却是derived的对象,不坏才怪
: --
: 我是弱者,但是我不会逆来顺受,因为那不是弱者,而是奴隶
: ...................
【 在 jackbupt 的大作中提到: 】
: 首先,谢谢答复。请问为何programe 2却不坏,不崩溃?
: 【 在 a206206 的大作中提到: 】
: : 明明调用的base的析构函数,指向的却是derived的对象,不坏才怪
: ...................
经dev测试,二者都没有发生你说的崩溃
后两个我觉得是一样的,调用机制是一样的,只不过一个有需函数表,一个没有。
VC6.0和VS2005 运行programe3均出现异常
【 在 a206206 的大作中提到: 】
: : 首先,谢谢答复。请问为何programe 2却不坏,不崩溃?
: : 【 在 a206206 的大作中提到: 】
: : : 明明调用的base的析构函数,指向的却是derived的对象,不坏才怪
: ...................
没有定死析构函数是否为虚函数。
析构函数只是类的一个函数而已,教材上要求析构函数是虚函数,是因为大多数人使用继承时会像pro1那样用,使用虚函数:反正告诉你个绝对没问题的方法,以后大家都这么做就OK了。
从这个观点来看pro2,就不会有什么问题。反正是两个正常函数,你不虚也无所谓。
从这个观点再看pro3,那pro3可以写成这样:
class A{ func(){};}
class B: public A { vitural func(){};}
俄 ...