BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #46540同步于 2010/11/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

析构函数征婚 求大牛 解惑

jackbupt
2010/11/21镜像同步14 回复
//**************************** 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最后崩溃,感激涕零!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
renne机器人#1 · 2010/11/21
我怎么记得析构函数不能为虚函数来着…… 【 在 jackbupt (jackbupt) 的大作中提到: 】 : //**************************** programe 1 ******************************* : #include "stdafx.h" : #include <iostream.h> : ...................
jackbupt机器人#2 · 2010/11/21
都说一般情况下,应该将析构函数定义为虚函数 【 在 renne 的大作中提到: 】 : 我怎么记得析构函数不能为虚函数来着…… : 【 在 jackbupt (jackbupt) 的大作中提到: 】 : : //**************************** programe 1 ******************************* : ...................
a206206机器人#3 · 2010/11/21
明明调用的base的析构函数,指向的却是derived的对象,不坏才怪
renne机器人#4 · 2010/11/21
可能我记错了吧………… 【 在 jackbupt (jackbupt) 的大作中提到: 】 : 都说一般情况下,应该将析构函数定义为虚函数
renne机器人#5 · 2010/11/21
哦……似乎是不能重载…… 【 在 renne (歼灭天使 玲) 的大作中提到: 】 : 可能我记错了吧…………
jackbupt机器人#6 · 2010/11/21
首先,谢谢答复。请问为何programe 2却不坏,不崩溃? 【 在 a206206 的大作中提到: 】 : 明明调用的base的析构函数,指向的却是derived的对象,不坏才怪 : -- : 我是弱者,但是我不会逆来顺受,因为那不是弱者,而是奴隶 : ...................
a206206机器人#7 · 2010/11/21
【 在 jackbupt 的大作中提到: 】 : 首先,谢谢答复。请问为何programe 2却不坏,不崩溃? : 【 在 a206206 的大作中提到: 】 : : 明明调用的base的析构函数,指向的却是derived的对象,不坏才怪 : ................... 经dev测试,二者都没有发生你说的崩溃 后两个我觉得是一样的,调用机制是一样的,只不过一个有需函数表,一个没有。
jackbupt机器人#8 · 2010/11/21
VC6.0和VS2005 运行programe3均出现异常 【 在 a206206 的大作中提到: 】 : : 首先,谢谢答复。请问为何programe 2却不坏,不崩溃? : : 【 在 a206206 的大作中提到: 】 : : : 明明调用的base的析构函数,指向的却是derived的对象,不坏才怪 : ...................
kissme机器人#9 · 2010/11/21
没有定死析构函数是否为虚函数。 析构函数只是类的一个函数而已,教材上要求析构函数是虚函数,是因为大多数人使用继承时会像pro1那样用,使用虚函数:反正告诉你个绝对没问题的方法,以后大家都这么做就OK了。 从这个观点来看pro2,就不会有什么问题。反正是两个正常函数,你不虚也无所谓。 从这个观点再看pro3,那pro3可以写成这样: class A{ func(){};} class B: public A { vitural func(){};} 俄 ...