CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

为什么虚构造函数和虚析构函数要一起提供

楼主Veiz(理论上存在)2006-07-02 12:59:58 在 C/C++ / C++ 语言 提问

请问各位两个问题:  
  1.   在g++中,必须在提供虚构造函数的同时提供虚析构函数?   这是为什么?   而VC不需要。  
  2.   是不是在模板类中使用纯虚函数是一种劣化?为什么?  
  谢谢! 问题点数:8、回复次数:21Top

1 楼runrunrun(农妇、山泉、有点田)回复于 2006-07-02 13:36:58 得分 0

虚构造函数   是什么东东Top

2 楼UPCC(杂食动物)回复于 2006-07-02 13:49:54 得分 2

1.   在g++中,必须在提供虚构造函数的同时提供虚析构函数?   这是为什么?   而VC不需要。  
  ------------------------------------  
  VC不是不要,而是编译器自动帮你补上了,而且“虚构造函数”应该是“构造函数”  
  目的是在析构对象的时候可以正确析构对象。  
   
  2.   是不是在模板类中使用纯虚函数是一种劣化?为什么?  
  -----------------------------------------------  
  不知道,但因为在模板类中使用纯虚函数,那么每个要使用的对象都必须特化。可能是特殊功能不确定导致的  
  Top

3 楼OOPhaisky(异化$渴望成功~~)回复于 2006-07-02 14:11:18 得分 0

虚构造函数??好像没有吧  
  Top

4 楼loomman(一剑)回复于 2006-07-02 14:32:17 得分 0

虚构造函数?不懂,不过先混个脸熟,学习一下Top

5 楼Piboye(柳月清风)回复于 2006-07-02 15:03:10 得分 0

还有这样的道理????????  
   
  虚构造函数,C++好像没有这么强的特性吧,这好像是OO   Pascal才有的吧。  
  Top

6 楼Veiz(理论上存在)回复于 2006-07-02 16:39:33 得分 0

哦,   的确是“析构函数”  
  不过我们教材是把基类的成员函数都称之为“虚函数”的...  
   
  第二个问题,“可能是特殊功能不确定导致的”怎么讲?  
   
   
  Top

7 楼triace_zhang(『雪梨码头』)回复于 2006-07-02 16:44:27 得分 0

不过我们教材是把基类的成员函数都称之为“虚函数”的.....  
  =====================================  
  究竟是什么教材和老师这么误人子弟.Top

8 楼playmud((猪头流氓)(抵制日货)(热烈庆祝火箭输球))回复于 2006-07-02 16:55:54 得分 0

提供虚析构函数是为了能够正确的释放资源。  
    effective   c++系列上有详细的说明。Top

9 楼Veiz(理论上存在)回复于 2006-07-02 17:39:21 得分 0

学院院长主编的教材啦。  
   
  回头看一下《effective   c++》Top

10 楼OOPhaisky(异化$渴望成功~~)回复于 2006-07-02 19:43:25 得分 0

把基类的成员函数都称之为“虚函数”??  
  你们院长真是误人子弟阿!!Top

11 楼hk8846(刀下无活人)回复于 2006-07-03 11:02:04 得分 0

我门老师(一位在IT行业混了20多年的老程序员)对我们讲:用析构函数是   最好在前面加个virtualTop

12 楼begtostudy(我的CSDN博客:http://blog.csdn.net/begtostudy/)回复于 2006-07-03 11:23:47 得分 2

析构函数做成virtual是为了正确的析构派生类的对象,因为派生类中可能会加入新的句柄成员,而基类的的析构函数是做不到的  
   
  至于构造函数,派生类都有自己的构造函数,会先调用基类的缺省构造函数(好像是,忘了,楼下的更正),构造函数在对象生成时就会调用,且只调用一次,没做成过虚的,没试过。  
   
  把基类的成员函数都称之为“虚函数”??--这句不明白  
  不过基类的成员函数可以虚函数方式的覆盖,或者是同名函数重写的隐藏两种方式改变倒是真的。Top

13 楼yeyuboy(海绵)回复于 2006-07-03 11:25:18 得分 3

1,虚构造函数-没听过、没见过,基类通常总要有虚析构函数,否则导致多态使用该类时出错,详见《Effective   C++》。  
  2,模板是编译期多态、虚拟函数是运行期多态。  
          纯虚拟函数定义的接口可以强制派生类必须提供实现,而且在物理上总是存在的。模板的接口在被使用后就必须提供实现,可以做到不使用时可以不实现(或实现后可被忽略掉)。当你在模板中使用纯虚拟函数定义接口时,模板的这种基于语法的接口定义所带来的好处(速度更快,因为少了运行期多态开销。空间占用通常被优化,未使用的函数可被忽略)就散失了。Top

14 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2006-07-03 11:28:19 得分 0

楼上说的很好。Top

15 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2006-07-03 11:30:27 得分 0

C++标准12.1.4上说:  
  A   constructor   shall   not   be   virtual   or   static.   ...   ...Top

16 楼changyanxiao(踏雪无情)回复于 2006-07-03 11:39:56 得分 1

虚拟构造函数是不需要的,派生类的构造函数会自动调用基类的构造函数。  
  虚拟析构函数是在多态的情况下使用,基类指针指向了派生类对象,析构的时候就必须调用派生类的析构函数,因此,析构函数推荐为虚拟Top

17 楼pingzhang500()回复于 2006-07-03 20:43:34 得分 0

在使用构造函数的时候,需要虚构造函数来清理相关的的垃圾数据,清理内存.  
  VC++是强大的编程软件,可以替代虚构造作用.  
  使用虚构函数要尽量避免使用,可能降低函数的效率.Top

18 楼Veiz(理论上存在)回复于 2006-07-03 21:14:07 得分 0

那么它提供的默认虚析构函数是怎么析构的?Top

19 楼fifthfloor()回复于 2006-07-03 22:54:57 得分 0

同志  
  ansi的C++中是没有虚构造函数的  
  虚析构函数函数不是随便用的。这个一般只在用到多态的情况下才会用。这样可以确保释放的  
  是你想要释放的类占有的资源。  
  我觉得不管什么编译器都最好用标准c++的东西  
  这样可以确保你和你的代码由高度可移植的优势。Top

20 楼zhschs(海山)回复于 2006-07-06 09:45:45 得分 0

markTop

21 楼kinkikid2002()回复于 2006-07-06 10:09:55 得分 0

虚构函数释放内存   其他的不晓得..Top

相关问题

关键词

得分解答快速导航

  • 帖主:Veiz
  • UPCC
  • begtostudy
  • yeyuboy
  • changyanxiao

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo