基类的析构函数为什么要是虚函数?

MFC_learner_1985 2011-06-01 02:34:52

class Base {
// ...
virtual ~Base();
};

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

void f()
{
Base* p = new Derived;
delete p; // virtual destructor used to ensure that ~Derived is called
}

在上面的代码里,是不是如果 ~Base() 不是虚函数, delete p 就只会调用 ~Base(),而不会调用 ~Derived()?
...全文
402 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
方紫涵 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]
引用楼主 mfc_learner_1985 的回复:
C/C++ code

class Base {
// ...
virtual ~Base();
};

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

void f()
{
Base* p = new Deri……

是的,原因详见:
虚析构函数问题……
[/Quote]++++
hengshan 2011-06-01
  • 打赏
  • 举报
回复
delete 基类的指针,可以调用子类的析构函数
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

class Base
{
public:
~Base(){cout << "Base::~Base" << endl;}
};

class Derived : public Base
{
public:
~Derived(){cout << "Derived::~Derived" << endl;}
};

int main()
{
Base* p = new Derived;
delete p;
return 0;
}

输出结果:
Base::~Base

3楼,4楼回答错误,楼主你的想法是对的
DX_deepblue 2011-06-01
  • 打赏
  • 举报
回复
学习观摩,为派生类着想~
天外来客-007 2011-06-01
  • 打赏
  • 举报
回复
基类的析构函数是虚函数,只是为了在虚函数表中占一个地址,用以保证在使用多态的代码中,可以调用到派生类的析构函数,避免内存泄露。
如果你能够保证你的派生类不会分配内存,可以不用在基类中把析构函数声明为虚的!
QQIANQQ 2011-06-01
  • 打赏
  • 举报
回复

如果不是虚函数,它只会根据指针的类型进行调用。所以说是的
晨星 2011-06-01
  • 打赏
  • 举报
回复
是的。
pathuang68 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 mfc_learner_1985 的回复:]
C/C++ code

class Base {
// ...
virtual ~Base();
};

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

void f()
{
Base* p = new Deri……
[/Quote]
是的,原因详见:
虚析构函数问题:为什么要将基类的的析构函数设成虚的?
zhanghengsdnu 2011-06-01
  • 打赏
  • 举报
回复
如果不是 ~Base() 不是虚函数, delete p 就只会调用 ~Base(),而不会调用 ~Derived()?
错。应该是就只会调用~Derived() 而不会调用 Base(),
  • 打赏
  • 举报
回复
如果基类的为虚的话,那么在释放派生类对象的时候,会首先调用派生类的析构函数,然后再调用基类的析构函数

如果基类析构函数不为虚的话,在释放派生类对象的时候就不会调用基类的析构函数,有可能造成内存泄露
bdmh 2011-06-01
  • 打赏
  • 举报
回复
面向对象的多态,这有可以让子类自行处理自己的释放动作
昵称很不好取 2011-06-01
  • 打赏
  • 举报
回复
写个代码测试下,虚函数的作用

64,683

社区成员

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

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