美文网首页
虚析构函数

虚析构函数

作者: __freetime | 来源:发表于2017-03-23 12:42 被阅读20次

虚析构函数

#include <iostream>
#include<string>
#include<cstdlib>

using namespace std;

class A
{
public:
    ~A()
    {
        cout << "A destructor" << endl;
    }
};
class B :public A
{
    ~B()
    {
        cout << "B destructor" << endl;
    }
};

int main()
{
    A *pa = new B;
    delete pa;
    return 0;
}

运行结果:

A destructor    // 只引发了 A 类的析构函数被调用,没有引发 B 类的析构函数

当将基类指针指向 new 运算符动态生成的派生类对象时,要通过 delete 来释放,应为该语句是静态联编的,编译器不可能知道此时 pa 指向哪个类型的对象,它只是根据 pa 类型是 A * ,来决定调用 A 类的析构函数,但实际上应该调用 B 类的析构函数才符合逻辑。

综上,delete pa 这样的语句应该根据 pa 所指的对象,来执行相应的析构函数。要实现这点,也用到了多态。因此,需要将基类的析构函数声明为虚函数,即虚析构函数。

改为:

class A
{
    virtual ~A()
    {
        cout << "A destructor" << endl;
    }
}
运行结果:

B destructor
A destructor

注意

  1. 派生类的析构函数会自动调用基类的析构函数。

  2. 一般,如果一个类定义了虚函数,则最好将析构函数也定义成虚函数。

  3. 只要在基类中某个函数被声明为虚函数,那么在派生类中,同名,同参数表的成员函数即使前面不写 virtual 关键字,也自动成为虚函数。

  4. 编译器看到是哪个类的指针,那么就会认为通过它访问的,就应该是哪个类的成员,编译器不会分析基类指针到底指向的是基类对象还是派生类对象。

#include <iostream>

using namespace std;

class A
{
public:
    void fun()
    {
        cout << "A called" << endl;
    }
};
class B :public A
{
    void fun()
    {
        cout << "B called" << endl;
    }
};
int main(void)
{
    B b;
    A *pa = &b;
    pa->fun();

    return 0;
}
运行结果:

A called

如果用上多态,则解决了这个问题:

#include <iostream>

using namespace std;

class A
{
public:
    virtual void fun()
    {
        cout << "A called" << endl;
    }
};
class B :public A
{
    void fun()
    {
        cout << "B called" << endl;
    }
};
int main(void)
{
    B b;
    A *pa = &b;
    pa->fun();

    return 0;
}
运行结果:

B called

由上,只在基类 A 中的 fun 函数前加了关键字 virtual (line 120),是该函数及其派生类中的同名,同参数表中的成员函数自动成为了虚函数,通过基类的指针调用虚函数时,就用到了多态。

相关文章

  • 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...

  • 2.0 C++远征:虚析构函数

    2-4虚析构函数 [TOC] 1.为什么引进虚析构函数? 多态中存在的问题:内存泄漏。为了解决内存泄漏的问题,引入...

网友评论

      本文标题:虚析构函数

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