21xrx.com
2024-12-23 00:43:43 Monday
登录
文章检索 我的文章 写文章
为什么C++基类析构函数不是虚函数会有问题?
2023-06-29 15:44:24 深夜i     --     --
C++ 基类 析构函数 虚函数 问题

C++中,继承是一种常见的面向对象编程方法,使得程序员可以通过建立类之间的继承关系,从而重用已有的代码和实现,提高代码复用性和可维护性。在这种情况下,基类中的析构函数往往是需要被重写的,以确保对象的正确释放。

但是,如果基类析构函数不被声明为虚函数,那么在对派生类对象进行delete操作时,只会调用派生类自身的析构函数,而不会调用基类的析构函数。这就会导致基类中所开辟的空间没有释放,引起内存泄露等问题。

比如,下面这个简单的例子就可以说明这种情况:


class Base{

public:

  Base()

    cout<<"Base created!"<<endl;

  

  ~Base()

    cout<<"Base destroyed!"<<endl;

  

};

class Derived:public Base{

public:

  Derived()

    cout<<"Derived created!"<<endl;

  

  ~Derived()

    cout<<"Derived destroyed!"<<endl;

  

};

int main(){

  Base *p = new Derived();

  delete p;

  return 0;

}

在这个例子中,我们创建了一个Base的派生类Derived,然后使用基类指针p指向这个Derived对象,并进行delete操作。由于基类析构函数没有被声明为虚函数,所以delete操作只会调用Derived的析构函数,而不会调用Base的析构函数。这就会导致Base中所开辟的空间没有被释放,最终引起内存泄露。

为了避免这种问题,我们需要将基类的析构函数声明为虚函数。这样,当一个派生类对象被销毁时,它所继承的所有基类的析构函数都会得到调用,以确保对象所占用的资源能够被正确释放。修正后的代码如下:


class Base{

public:

  Base()

    cout<<"Base created!"<<endl;

  

  virtual ~Base() // 将析构函数声明为虚函数

    cout<<"Base destroyed!"<<endl;

  

};

class Derived:public Base{

public:

  Derived()

    cout<<"Derived created!"<<endl;

  

  ~Derived()

    cout<<"Derived destroyed!"<<endl;

  

};

int main(){

  Base *p = new Derived();

  delete p;

  return 0;

}

通过将基类析构函数声明为虚函数,我们可以正确地打印出Base的创建和销毁信息,避免了内存泄露等问题的发生。

综上,C++的基类析构函数必须被声明为虚函数。只有这样,我们才能保证在进行派生类对象的销毁时,能够正确调用基类的析构函数,释放对象所占用的全部资源。

  
  
下一篇: C++输出n个数

评论区

{{item['qq_nickname']}}
()
回复
回复