派生类的析构函数可以不用virtual吧?

abc优希 2008-12-10 04:54:33
class Base{
public:
virtual ~Base();
};

class Sub:public Base{
public:
~Sub();
};

可以么?这样
...全文
286 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-12-11
  • 打赏
  • 举报
回复
你因为缺乏一本好点的教材,所以都无从判断什么问题是有深层原理的,什么就只一个“是或否”的。
古语说学而不思如何如何,思而不学又如何如何。你现在折在这个思而不学上了。

[Quote=引用 15 楼 onion101325 的回复:]
4楼,你能解释下为什么可以么?只要教材上的一个“是”OR“否”那样的学习方法我是不赞成的,想知道深层的原理了。
[/Quote]
bbb332 2008-12-10
  • 打赏
  • 举报
回复
当然可以了....
双刃剑客 2008-12-10
  • 打赏
  • 举报
回复
可以,派生类的默认也为virtual,要在派生类中显示调用基类的虚析构函数
这个正确

总的原则是
如果不做基类,就不要virtual.
如果有可能成为基类,就一定要virtual.

所以建议,你都加上virtual,虽然影响了一些效率,但谁知道你设计的这个类
以后不会做基类呢.
为什么呢?
因为
class A
{
};
Class B: public A
{
};

你这样 A *pA= new B;
这时候会发生object slicing.
当要释放对象的时候.
如果没有virtual,按造静态绑定的规则,就只调用了基类的析构函数,这时候派生类(除去基类的数据)
一部分数据仍然留在内存中.但你已经没机会释放了.造成了内存泄露.
如果有virtual ,按早动态绑定的规则.
调用派生类的析构函数.
所以派生类的析构函数要显示调用基类的析构函数.以求释放申请的全部的内存资源.
abc优希 2008-12-10
  • 打赏
  • 举报
回复
二楼的说法 不是这样的吧,我测试了把sub做基类再派生也是可以的。
4楼,你能解释下为什么可以么?只要教材上的一个“是”OR“否”那样的学习方法我是不赞成的,想知道深层的原理了。
SeanHwang 2008-12-10
  • 打赏
  • 举报
回复
基类写过后就不需要写了~
zhangliuxia 2008-12-10
  • 打赏
  • 举报
回复
不需要!
ofan 2008-12-10
  • 打赏
  • 举报
回复
如果派生类又作为一个基类 那么其析构函数最好为虚拟的
书上说与效率有点关系
wiowei 2008-12-10
  • 打赏
  • 举报
回复
《Effective C++》也给出一样的看法,当类至少拥有一个虚拟函数时,这次应该把析构函数定义为虚拟函数。不定义为虚拟函数能够节约对象体积(不含vptr)及提高移植性。详细见《Effective C++》条款7。
wiowei 2008-12-10
  • 打赏
  • 举报
回复
来看C++设计者Bjarne Stroustrup的说法:
Bjarne:为何析构函数默认不是virtual

因为很多类并不是被设计作为基类的。只有类在行为上是它的派生类的接口时(这些派生类往往在堆中分配,通过指针或引用来访问),虚拟函数才有意义。
  那么什么时候才应该将析构函数定义为虚拟呢?当类至少拥有一个虚拟函数时。拥有虚拟函数意味着一个类是派生类的接口,在这种情况下,一个派生类的对象可能通过一个基类指针来销毁。例如:
class Base {
 // ...
 virtual ~Base();
};

class Derived : public Base {
 // ...
 ~Derived();
};

void f()
{
 Base* p = new Derived;
 delete p; // 虚拟析构函数保证~Derived函数被调用
}

 如果基类的析构函数不是虚拟的,那么派生类的析构函数将不会被调用——这可能产生糟糕的结果,例如派生类的资源不会被释放。
once_and_again 2008-12-10
  • 打赏
  • 举报
回复
作基类 是virtual

必须是public
如果是纯的,必须是protected的
对不?
luojc714 2008-12-10
  • 打赏
  • 举报
回复
其实吧,这个东西如果在派生类中不写vitual编译器是不会为难你的,这是没问题的!
只是如果你写了vitual的话会给看你代码的人一点提示,说明这是在重载基类的函数,而不是定义的一个新的函数。再说了,写代码的人也未必就一直记得住这个问题...还是写一下吧!
nullah 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lc19890326 的回复:]
基类的析构函数为virtual主要是为了在删除基类指针(或许指向了new的派生类对象)的时候能正确删除派生类对象的部分


C/C++ code
Base* p=new Sub;
.....
delete p;//如果Base的析构函数不为virtual的时候,在这个地方就没办法删除Sub没办法被销毁了



如果Sub不再作为基类去派生的话 析构函数就不用作为virtual了
[/Quote]
正解 要理解为什么把析构函数声明为virtual
如果没有类派生自Sub了 那就可以不为virtual了
不过一般都建议声明析构函数时 为virtual 因为不知道哪天你可能会继承sub这个class
hearoequal 2008-12-10
  • 打赏
  • 举报
回复
貌似自动虚了吧
lc19890326 2008-12-10
  • 打赏
  • 举报
回复
基类的析构函数为virtual主要是为了在删除基类指针(或许指向了new的派生类对象)的时候能正确删除派生类对象的部分


Base* p=new Sub;
.....
delete p;//如果Base的析构函数不为virtual的时候,在这个地方就没办法删除Sub没办法被销毁了

如果Sub不再作为基类去派生的话 析构函数就不用作为virtual了
taodm 2008-12-10
  • 打赏
  • 举报
回复
楼主啊,说实话,如果你的教材里没讲到这个问题的话就赶紧换本好点的。
如果这样的基本问题都需要到csdn上问,那你的学习过程就太漫长太吃力了。
killbug2004 2008-12-10
  • 打赏
  • 举报
回复
可以,派生类的默认也为virtual,要在派生类中显示调用基类的虚析构函数
qqwx_1986 2008-12-10
  • 打赏
  • 举报
回复
当然可以 如果你想Sub再作为基类派生的话 析构函数就要申明为virtual
如果不做基类就没事
hai040 2008-12-10
  • 打赏
  • 举报
回复
再写个类继承sub运行一下就清楚了

64,646

社区成员

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

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