免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2631 | 回复: 5
打印 上一主题 下一主题

[C++] 什么时候调用虚函数会有风险? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-21 09:01 |只看该作者 |倒序浏览
本帖最后由 sampher 于 2013-11-21 19:38 编辑

构造和析构函数?........

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2013-11-21 09:22 |只看该作者
我理解不了为什么destructor的中文名是“析构函数”。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2013-11-21 09:31 |只看该作者
析构函数里 不能 调用Virtual函数的:

class base{
virtual void f() =0;
~base(){
   this->f();
}
}
class child:base{
class sss abc;
vitural void f(){
  abc.do_fun();
  return;
}
}

你会发现base调用f()时, f()存取了无效的数据。
除非它是sealed类型的(也就是不会有子类),可是c++中没有sealed关键字。。。

论坛徽章:
0
4 [报告]
发表于 2013-11-21 10:24 |只看该作者
本帖最后由 sampher 于 2013-11-21 18:59 编辑

这里例子很好啊

论坛徽章:
0
5 [报告]
发表于 2013-11-21 10:35 |只看该作者
本帖最后由 sampher 于 2013-11-21 19:00 编辑
folklore 发表于 2013-11-21 09:31
析构函数里 不能 调用Virtual函数的:

class base{


你的这段代码即使写出来,也是编译不过的:

  1. #include<iostream>
  2. using namespace std;
  3. class sss
  4. {
  5. public:
  6.         void do_fun(){cout<<__FUNCTION__<<endl;}
  7. };
  8. class base{
  9. public:
  10.         virtual void f() =0;
  11.         ~base(){
  12.            this->f();
  13.         }
  14. };
  15. class child:public base{
  16. public:
  17.         sss abc;
  18.         void f(){
  19.           abc.do_fun();
  20.         }
  21. };
  22. int main(int argc, char* argv[])
  23. {
  24.         base* pb=new child();
  25.         delete pb;
  26.         return 0;
  27. }
复制代码
我在RHEL5上用GCC4.1编译说有错,f函数没有实现

你能举出一个能编译过能运行并出错的代码片段吗?

论坛徽章:
0
6 [报告]
发表于 2013-11-21 15:03 |只看该作者
构造函数和析构函数在执行期间,其对应的对象不是完整的,此时调用的虚函数,结果不可预知。于是,编译器将不会执行动态绑定,仅简单的执行构造函数和析构函数对应的对象的函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP