构造与析构函数可以是虚函数吗?今天面试的问题

yjcq 2004-11-25 02:29:30
构造与析构函数可以是虚函数吗?今天面试的问题
...全文
1462 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赖勇浩 2004-11-26
  • 打赏
  • 举报
回复
构造不行,析构可以。
并且,如果打算作为基类的话,析构必须是虚函数,
microhard 2004-11-26
  • 打赏
  • 举报
回复
楼主面试的时候又没有答出来呀
crgxw 2004-11-26
  • 打赏
  • 举报
回复
构造函数不能是虚函数,虚构函数最好是虚函数
蒋晟 2004-11-26
  • 打赏
  • 举报
回复
6 为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?为什么纯虚析构函数可以通过编译,但是不能通过连接?

回答:

编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。

所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。

C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。
关键字:”virtual destructor”
yevv 2004-11-25
  • 打赏
  • 举报
回复
构造函数不能是虚函数,虚构函数最好是虚函数.这里猫腻挺多的 《c++编程思想〉15章有介绍
王旺旺旺 2004-11-25
  • 打赏
  • 举报
回复
面试都结束了,
你还问这个问题有什么用?
panux 2004-11-25
  • 打赏
  • 举报
回复
说到这个问题,就需要考虑虚函数的原理.

虚函数的调用必须要有V_TABLE的支持,当在构造函数中的时候, 对象还没有构造完成,是没有这个表

的,所以无法调用虚函, 而析构函调用的时候,很显然,对象已经构造完毕.!
Potters 2004-11-25
  • 打赏
  • 举报
回复
考基本功
yjcq 2004-11-25
  • 打赏
  • 举报
回复
为什么呀?
binscut 2004-11-25
  • 打赏
  • 举报
回复
好象com中的接口都是只含虚函数的类,这些类无法实例化
duhuitian 2004-11-25
  • 打赏
  • 举报
回复
构造函数决不能是虚函数,析构函数最好用作虚函数,可参看effective c++
liuleilover 2004-11-25
  • 打赏
  • 举报
回复
moany(长枪大戟) ( ) 信誉:100

析构函数可以不是虚函数,不要说的太绝对。
例如

class A
{
public:
A(){};
~A(){};
int i;
}

struct A
{
int i;
}
在二进制层面是相等的,但把~A()说明成virtual的则就不存在相等关系了。

例如MFC中的CPoint为了和POINT兼容(能够在使用POINT的地方能被使用),不能设置其析构函数为虚函数。
xuzheng318 2004-11-25
  • 打赏
  • 举报
回复
构造函数不能是虚函数
析构函数可以是虚函数
pigja 2004-11-25
  • 打赏
  • 举报
回复
构造函数不要用虚函数,析构函数最好用虚函数。
hhygcy 2004-11-25
  • 打赏
  • 举报
回复
析构函数可以是
构造函数不可以
这个好像是虚函数的基础问题啊:)
liuleilover 2004-11-25
  • 打赏
  • 举报
回复
构造函数不能是虚函数
析构函数可以是虚函数,如果类被设计成能被继承的析构函数必须是虚函数
moany 2004-11-25
  • 打赏
  • 举报
回复
构造不行,析构可以。
并且,如果打算作为基类的话,析构必须是虚函数,以便派生类析构时能层层调用,一直到基类都析构。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧