美文网首页
浅谈多态基类声明虚析构函数

浅谈多态基类声明虚析构函数

作者: 舌尖上的搬砖汉 | 来源:发表于2016-05-30 02:02 被阅读54次

    通过学习我们了解到派生类对象是由积累部分和派生类不恨构成的,那么该派生类对象是如何被析构和够早的呢?

    #include <iostream>

    using namespace::std;

    class A{

    public:

    A(){

    cout<<“A的构造函数被调用"<<endl;}

    ~A(){   cout<<"A的析构函数被调用"<<endl;}  };

    class B:public A{

    public:

    B(){   cout<<"B的构造函数被调用"<<  endl;}

    ~B(){  cout<< "B的析构函数被调用" <<endl;}  };

    int main(){

    B b;

    return 0;}

    输出结果

    A的构造函数被调用

    B的构造函数被调用

    B的析构函数被调用

    A的析构函数被调用

    可以看到:构造一个派生类对象的时候,先调用基类的构造函数,再调用派生类的构造函数,析构一个派生类对象的时候,先调用派生类的析构函数,再调用基类的析构函数。

    上述内容讲述的是普通派生类的构造和析构过程,对于具有虚函数的派生类的构造和析构过程是怎样的呢?此时基类的析构函数没有声明称virtual

    #include

    using namespace::std;

    class A{

    public:

    A(){

    cout<<“A的构造函数被调用"<

    ~A(){   cout<<"A的析构函数被调用"<<endl;}

    virtual do(){ cout<<"a can do sth;"<<endl;}};

    class B:public A{

    public:

    B(){   cout<<"B的构造函数被调用"<<  endl;}

    ~B(){  cout<< "B的析构函数被调用" <endl;}

    virtual do(){ cout<<"b can do anything ;"<<endl;

    int main(){

    A *a=new B;

    delete a;

    return 0;}

    运行结果如下

    A的构造函数被调用

    B的构造函数被调用

    A的析构函数被调用

    可以看到,当通过A类型的指针来deleteB类型的对象时,只调用了A的析构函数,所以这个对象的派生部分的内存并没有被释放,从而造成内存泄露。

    所以:当基类中包含有虚函数的时候,析构函数一定要写成虚析构函数,否则会造成内存泄露。

    相关文章

      网友评论

          本文标题:浅谈多态基类声明虚析构函数

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