社区
C++ 语言
帖子详情
构造与析构函数可以是虚函数吗?今天面试的问题
yjcq
2004-11-25 02:29:30
构造与析构函数可以是虚函数吗?今天面试的问题
...全文
1489
17
打赏
收藏
构造与析构函数可以是虚函数吗?今天面试的问题
构造与析构函数可以是虚函数吗?今天面试的问题
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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++
面试
宝典2015版》
new会调用对象的
构造
函数,而delete会调用对象的
析构函数
。malloc和free只能申请和释放内存,不能调用
构造
函数和
析构函数
。 2. delete与delete[]的区别 delete只会调用一次
析构函数
,而delete[]会调用每一个成员的...
为什么
析构函数
必须是
虚函数
?为什么默认的
析构函数
不是
虚函数
?
今天
我们来谈一谈
面试
C++ 工程师时经常被谈到的一个
问题
:为什么
析构函数
必须是
虚函数
?为什么默认的
析构函数
不是
虚函数
? 首先,我们看一下百度百科对
虚函数
是怎么定义的: 在某基类中声明为 virtual并在一个或多个...
[每天一道
面试
题 c++] Day10 为什么
析构函数
必须是
虚函数
?为什么C++默认的
析构函数
不是
虚函数
?
构造
函数可以是
虚函数
吗?
将被继承的父类的
析构函数
设置为
虚函数
后,可以保证在new申请一个子类对象,并使用基类指针指向该对象,当释放该基类指针时可以保证子类的
析构函数
被执行,从而释放子类的空间,避免内存泄露。 为什么C++默认的析构...
构造
函数和
析构函数
可以是
虚函数
吗?为什么?
三、
构造
函数和
析构函数
可以是
虚函数
吗?为什么? 1、
构造
函数 从存储空间角度,
虚函数
对应一个指向vtable
虚函数
表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。
问题
出来了,...
为什么
构造
函数不能为
虚函数
,而
析构函数
可以为
虚函数
?
存储空间角度:
虚函数
的调用需要
虚函数
表指针,而该指针存放在对象的内容空间中,需要调用
构造
函数才可以创建他的值,否则即使开辟了空间,则虚表指针为随机值,不会找到
构造
函数;若
构造
函数声明为
虚函数
,那么...
C++ 语言
65,184
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章