为什么虚构造函数和虚析构函数要一起提供
请问各位两个问题:
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




