社区
C++ 语言
帖子详情
构造与析构函数可以是虚函数吗?今天面试的问题
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
打赏
举报
回复
构造不行,析构可以。
并且,如果打算作为基类的话,析构必须是虚函数,以便派生类析构时能层层调用,一直到基类都析构。
TechCPP:【C ++
面试
&C ++学习指南】这里整理了C ++精确研发工程师
面试
和工作必备的知识点
父类的
析构函数
为什么要定义为
虚函数
? 内联函数,
构造
函数,静态成员函数可以是
虚函数
吗?
构造
函数中可以调用
虚函数
吗? 为什么需要虚继承?虚继承实现原理解析, C ++内存分配机制 指针 迭代器与普通指针有什么...
为什么
析构函数
必须是
虚函数
?为什么默认的
析构函数
不是
虚函数
?
今天
我们来谈一谈
面试
C++ 工程师时经常被谈到的一个
问题
:为什么
析构函数
必须是
虚函数
?为什么默认的
析构函数
不是
虚函数
? 首先,我们看一下百度百科对
虚函数
是怎么定义的: 在某基类中声明为 virtual并在一个或多个...
[每天一道
面试
题 c++] Day10 为什么
析构函数
必须是
虚函数
?为什么C++默认的
析构函数
不是
虚函数
?
构造
函数可以是
虚函数
吗?
将被继承的父类的
析构函数
设置为
虚函数
后,可以保证在new申请一个子类对象,并使用基类指针指向该对象,当释放该基类指针时可以保证子类的
析构函数
被执行,从而释放子类的空间,避免内存泄露。 为什么C++默认的析构...
构造
函数和
析构函数
可以是
虚函数
吗?为什么?
三、
构造
函数和
析构函数
可以是
虚函数
吗?为什么? 1、
构造
函数 从存储空间角度,
虚函数
对应一个指向vtable
虚函数
表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。
问题
出来了,...
1、
构造
函数、
析构函数
可以写成
虚函数
么?
1、在多态当中,基类的方法被定义成
虚函数
,才可以通过基类指针动态调用派生类的方法,同理当我们delete 基类指针,如果基类
析构函数
不是
虚函数
,就无法动态调用到派生类的
析构函数
,导致派生类的对象无法析构,...
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章