码迷,mamicode.com
首页 > 其他好文 > 详细

基类析构函数为虚函数

时间:2016-09-14 01:47:47      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

代码:析构函数为非虚函数

技术分享
#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(int argc, char** argv)
{
    A *pa = new B();
    delete pa;

    B *pb = new B();
    delete pb;
}
View Code

输出:

A
B
~A
A
B
~B
~A

指向子类对象的基类指针,析构过程未调用子类的析构函数,若子类申请内存空间,则将无法被释放,导致内存泄漏。

代码:析构函数为虚函数

技术分享
#include <iostream>

using namespace std;

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

        virtual ~A()
        {
            cout << "~A" << endl;
        }
};

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

        virtual ~B()
        {
            cout << "~B" << endl;
        }
};


int main(int argc, char** argv)
{
    A *pa = new B();
    delete pa;

    B *pb = new B();
    delete pb;
}
View Code

输出:

A
B
~B
~A
A
B
~B
~A

指向子类对象的基类指针,析构过程先调用子类析构函数,再调用基类析构函数。

若析构函数为非虚函数时,delete p 会直接调用相应指针类型的析构函数 即父类析构函数。若析构函数为虚函数时,则会调用实际对象的析构函数,即子类析构函数,子类继承自父类,子类析构函数调用完,会接着调用父类析构函数。

基类析构函数为虚函数

标签:

原文地址:http://www.cnblogs.com/StoneHan/p/5797737.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!