前言
在effective c++中有这么一句话:确定基类有虚析构函数。
记得早期学c++的时候,很多书上会把基类的析构函数声明为虚函数,并且这样介绍虚函数,但是一直没有深入理解基类为什么要用虚函数作为析构函数。
构造函数和析构函数
定义就不讲了,很容易理解。很多时候在构造函数里面申请空间,在析构函数里面释放空间。
书上讲的例子都很简单。
我们这里写一个例子,来讲一下。
#include <iostream>
using namespace std;
class A
{
public:
A();
~A();
};
A::A()
{
cout<<"A construct"<<endl;
}
A::~A()
{
cout<<"A destruct"<<endl;
}
class B:public A
{
public:
B();
~B();
};
B::B()
{
cout<<"B construct"<<endl;
}
B::~B()
{
cout<<"B destcuct"<<endl;
}
class C
{
public:
C();
virtual ~C();
virtual void print();
};
C::C()
{
cout<<"C construct"<<endl;
}
C::~C()
{
cout << "C destruct"<<endl;
}
void C::print()
{
cout <<" C print"<<endl;
}
class D:public C
{
public:
D();
virtual ~D();
virtual void print();
};
D::D()
{
cout<<"D construct"<<endl;
}
D::~D()
{
cout << "D destruct"<<endl;
}
void D::print()
{
cout<<"D print"<<endl;
}
int main()
{
cout<<"----------a---------"<<endl;
A a;
cout<<"----------b---------"<<endl;
B b;
cout<<"----------p---------"<<endl;
A *p = new B;
delete p;
cout<<"----------q---------"<<endl;
C *q = new D;
q->print();
delete q;
cout<<"---------end--------"<<endl;
}
可以看到输出的结果如下:
----------a---------
A construct
----------b---------
A construct
B construct
----------p---------
A construct
B construct
A destruct
----------q---------
C construct
D construct
D print
D destruct
C destruct
---------end--------
B destcuct
A destruct
A destruct
我们分析一下:
A a;这个很好理解,调用A的构造函数。
所以输出的是
A construct
B b 呢,就是先调用A的,在调用B的构造函数
得到的是
A construct
B construct
然后在函数执行完,a,b的生命期就结束了。
系统会自己调用它们的析构函数,因为是栈的关系,先进后出。
所以先调用B的,析构也是和构造相反。
B destruct
A destruct
下来调用A 的
A destruct