为什么构造函数不能是虚函数?
rt 问题点数:20、回复次数:12Top
1 楼benh(滴答)回复于 2006-09-01 08:56:41 得分 20
构造函数是在对象完全构造之前运行的,在构造函数运行的时候,对象的动态类型还不完整。Top
2 楼believefym(feng)回复于 2006-09-01 09:00:30 得分 0
虚函数主要是为了实现多态
构造函数如果是虚函数有必要吗?Top
3 楼Stephen_Ma(极品飞马)回复于 2006-09-01 16:58:57 得分 0
构造的时候创建虚函数表,如果构造函数也是虚函数的话,程序就不知道怎样创建了。Top
4 楼sinall()回复于 2006-09-01 17:04:59 得分 0
反证法:
构造函数可以是虚函数,请问你打算怎么调用?Top
5 楼sinall()回复于 2006-09-01 17:20:57 得分 0
嗯,想了下,子类覆盖父类构造函数,并在初始化列表中调用之,倒是一种应用。
不过,这样是不是就破坏了类的封装性。Top
6 楼liu584(好好学习C++)回复于 2006-09-02 11:45:33 得分 0
大师们解释了一箩筐了
随便找点书看就是了Top
7 楼zhaowanru19(***婉如***)回复于 2006-09-02 12:35:00 得分 0
我怎么记得构造函数可以是虚函数但是析构函数就不可以了!Top
8 楼060(060)回复于 2006-09-02 14:08:08 得分 0
TO
zhaowanru19()
你说反了。析构函数可以为虚函数。MFC中有许多这样的类。Top
9 楼rubbish_only(原谅我的丑)回复于 2006-09-02 14:22:16 得分 0
首先楼主要明白虚函数。在运行期才能识别应该调用是基类的或是子类的虚函数,而调用的依据就是看到底是基类的对象还是子类的对象(或指针),但是构造函数不行,因为在构造函数调用之前对象还不存在,所以应该由谁来调用这个“虚构造函数呢”?Top
10 楼SuperXu_swjtu(SuperXu)回复于 2006-09-02 14:24:00 得分 0
因为如果构造函数为虚函数的话,它将在执行期间被构造,而执行期则需要对象已经建立,构造函数所完成的工作就是为了建立合适的对象,因此在没有构建好的对象上不可能执行多态(虚函数的目的就在于实现多态性)的工作。
在继承体系中,构造的顺序就是从基类到派生类,其目的就在于确保对象能够成功地构建。楼上也说了,构造函数同时承担着虚函数表的建立,如果它本身都是虚函数的话,如何确保vtbl的构建成功呢?Top
11 楼OOPhaisky(异化$渴望成功~~)回复于 2006-09-02 15:43:43 得分 0
老生常谈了,本想找到一个帖子,但是没找到:(Top
12 楼sinkileu(小心)回复于 2006-09-02 15:54:52 得分 0
同意benh(滴答)、Stephen_Ma(极品飞马) 、rubbish_only(原谅我的丑)、SuperXu_swjtu(SuperXu)Top




