社区
C++ 语言
帖子详情
构造与析构函数可以是虚函数吗?今天面试的问题
yjcq
2004-11-25 02:29:30
构造与析构函数可以是虚函数吗?今天面试的问题
...全文
1551
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
打赏
举报
回复
构造不行,析构可以。
并且,如果打算作为基类的话,析构必须是虚函数,以便派生类析构时能层层调用,一直到基类都析构。
为什么
析构函数
必须是
虚函数
?为什么默认的
析构函数
不是
虚函数
?
本文探讨了C++中
析构函数
为何应当声明为
虚函数
,尤其是在多态性和内存管理方面的重要性。通过对比
虚函数
与非
虚函数
析构函数
的行为差异,解释了在基类中使用虚
析构函数
的必要性,以防内存泄漏。
构造
函数和
析构函数
调用
虚函数
会发生什么
本文探讨了在C++中
构造
函数和
析构函数
调用
虚函数
的行为,解释了为何这种调用无法体现
虚函数
的动态绑定特性,并通过代码实验展示了基类和派生类
构造
与析构时的
虚函数
调用现象。
C++学习——
虚函数
本文详细介绍了C++中
虚函数
和纯
虚函数
的概念、用途、区别以及它们在
构造
函数、
析构函数
中的限制。重点讨论了抽象类的定义和
虚函数
的工作原理,以及
虚函数
带来的性能代价。,
C++
构造
函数和
析构函数
使用中注意的事项
本文介绍了C++中
构造
函数和
析构函数
的使用细节,强调不应让异常逃离
析构函数
,以及避免在
构造
和
析构函数
中调用
虚函数
。在
析构函数
抛出异常可能导致资源泄漏和不明确行为,建议捕获异常或在普通函数中处理。同时,由于对象
构造
过程中的类型
问题
,不应在
构造
和析构过程中调用
虚函数
。
C/C++
面试
题2「
虚函数
、多态、内存管理与软件调试篇」
本文详细探讨了C++中的多态性,特别是
虚函数
的工作原理,以及何时需要将
析构函数
声明为
虚函数
。此外,还讨论了malloc与free、new与delete的区别,内存泄露的原因,以及C/C++内存越界类型。同时,文章提供了C++程序调试的常用方法和应对异常的策略。
C++ 语言
65,211
社区成员
250,515
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章