美文网首页
4.2C++虚析构函数

4.2C++虚析构函数

作者: tomchan | 来源:发表于2015-10-06 17:38 被阅读68次

为什么构造函数不能声明虚函数

在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数。因为在执行构造函数前对象尚未创建完成,虚函数表尚不存在,也没有指向虚函数表的指针,所以此时无法查询虚函数表,也就不知道要调用哪一个构造函数。

析构函数则用于在销毁对象时完成相应的资源释放工作,可以被声明为虚函数。

虚析构函数

#include 

using namespace std;

//基类

class Base{

private:

int *a;

public:

Base();

~Base(){ cout<<"Base destructor"<

};

Base::Base(){

a = new int[100];

cout<<"Base constructor"<

}

//派生类

class Derived: public Base{

private:

int *b;

public:

Derived();

~Derived( ){ cout<<"Derived destructor"<

};

Derived::Derived(){

b = new int[100];

cout<<"Derived constructor"<

}

int main( ){

Base *p = new Derived;

delete p;

return 0;

}

运行结果:

Base constructor

Derived constructor

Base destructor

本例中定义了两个类,基类 Base 和派生类 Derived,它们都有自己的构造函数和析构函数。在构造函数中,会分配100个 int 型的内存空间;在析构函数中,会把这些内存释放掉。

在 main 函数中,定义了基类类型的指针 p,并指向派生类对象,然后希望用 delete 释放 p 所指向的空间。

从运行结果可以看出,执行delete p;语句时只调用了基类的析构函数,却没有调用派生类的析构函数。这会导致 b 所指向的 100 个 int 型内存空间得不到释放,除非程序运行结束被操作系统回收,否则就再也没有机会释放这些内存。这是典型的内存泄露。

内存泄露问题是程序员需要极力避免的。本例中出现的内存泄露是由于派生类的析构函数未被调用引起的,为了解决这个问题,需要将基类的析构函数声明为虚函数。修正后的代码如下所示:

class Base{

private:

int *a;

public:

Base();

virtual ~Base(){ cout<<"Base destructor"<

};

Base::Base(){

a = new int[100];

cout<<"Base constructor"<

}

运行结果:

Base constructor

Derived constructor

Derived destructor

Base destructor

如此,派生类的析构函数也会自动成为虚析构函数。当执行delete p;语句时,会先执行派生类的析构函数,再执行基类的析构函数,这样就不存在内存泄露问题了。

这个例子足以说明虚析构函数的必要性,但是如果不管三七二十一的将所有的基类的析构函数都声明为虚函数,也是不合适的。通常来说,如果基类中存在一个指向动态分配内存的成员变量,并且基类的析构函数中定义了释放该动态分配内存的代码,那么就应该将基类的析构函数声明为虚函数。

相关文章

  • 4.2C++虚析构函数

    为什么构造函数不能声明虚函数 在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数。因为在执行构造...

  • 2020-02-10 C++基础2

    1:为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 将可能会被继承的父类的析构函数设置为虚...

  • C++虚函数的一些奇怪问题总结

    构造函数能否为虚函数?在构造函数中调用虚函数会如何?析构函数能否为虚函数?析构函数能否为纯虚函数?其实日常开发中基...

  • c++primer 15.24-15.30

    15.24基类一般定义一个虚析构函数但是虚析构函数会阻止移动操作但是虚析构函数会帮助基类派生类体系动态销毁对象15...

  • C++的虚析构函数

    首先,我们必须知道,虚析构函数是有其本身的目的,所以正常情况下,我们不应该声明虚析构函数。 构造函数和析构函数是一...

  • C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用...

  • C++第9天: 第137-第142课 纯虚函数,抽象类,虚析构,

    纯虚析构,防止父类指针无法访问子类析构函数

  • ★03.关于单继承

    基类总是要写虚析构函数 通过设置析构函数为纯虚函数来让类称为抽象基类 代码 函数virtual属性的传递性 拷贝移...

  • C++总结

    函数 为什么基类的析构函数用虚函数 在实现多态时,当用基类操作派用类,在析构时防止只析构基类而不析构派生类的状况发...

  • Day1:C++虚机制的实现

    1. 虚析构函数 话不多说,贴代码: 可以看到执行的结果是先调用了 的析构函数,再调用了 的析构函数; 如果将vi...

网友评论

      本文标题:4.2C++虚析构函数

      本文链接:https://www.haomeiwen.com/subject/npwgcttx.html