编程语言
首页 > 编程语言> > C++的析构函数与虚函数实战

C++的析构函数与虚函数实战

作者:互联网

一 点睛

在C++中,构造函数不能声明为虚函数。然而,析构函数可以声明为虚函数。

C++明确指出,当派生对象经由一个基类指针被删除、而该基类带着一个非虚函数析构函数,会导致对象的派生成分无法被销毁。

二 析构函数不是虚函数容易引发内存泄露

1 代码

#include<iostream>
using namespace std;
class Base{
public:
    Base(){ std::cout<<"Base::Base()"<<std::endl; }
    ~Base(){ std::cout<<"Base::~Base()"<<std::endl; }
};
class Derive:public Base{
public:
    Derive(){ std::cout<<"Derive::Derive()"<<std::endl; }
    ~Derive(){ std::cout<<"Derive::~Derive()"<<std::endl; }
};
int main(){
    Base* pBase = new Derive();
    /*这种base classed的设计目的是为了用来"通过base class接口处理derived class对象"*/
    delete pBase;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0231.cpp -o 0231
[root@localhost charpter02]# ./0231
Base::Base()
Derive::Derive()
Base::~Base()

3 说明

两个类各自有构造函数和析构函数,并且基类和派生类的析构函数都是非虚函数。从执行结果来看,虚构函数的调用是存在问题的,也就是说析构函数只做了局部销毁工作,这可能造成资源泄露、损坏数据结构等问题。

解决此问题的方法:只要给基类一个virtual 析构函数即可。

三 基类的析构函数为虚函数

1 代码

#include<iostream>
using namespace std;
class Base{
public:
    Base(){ std::cout<<"Base::Base()"<<std::endl; }
    virtual ~Base(){ std::cout<<"Base::~Base()"<<std::endl; }
};

class Derive:public Base{
public:
    Derive(){ std::cout<<"Derive::Derive()"<<std::endl; }
    ~Derive(){ std::cout<<"Derive::~Derive()"<<std::endl; }
};

int main(){
    Base* pBase = new Derive();
    delete pBase;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0232.cpp -o 0232
[root@localhost charpter02]# ./0232
Base::Base()
Derive::Derive()
Derive::~Derive()
Base::~Base()

3 说明

把基类的析构函数声明为虚函数,就能正常析构了。

标签:std,Derive,函数,C++,Base,析构,基类
来源: https://blog.csdn.net/chengqiuming/article/details/89743024