析构函数一般不显式调用,由系统自动调用,并且遵循先构造的后析构的原则,但是如果显式的由“对象名.析构函数名”系统在执行该语句时只是把它当做类的普通成员函数,在遇到return语句时任会隐式的调用析构函数,这样已经被销毁的数据再一次被销毁,并且可以通过编译器,以下是一个完整的例子:
#include<iostream>
using namespace std;
class CBase1
{
int x ;
public:
CBase1( )
{x=0 ; cout<<"调用构造函数CBase1( )!\n";}
CBase1( int a)
{x=1;cout<<"调用构造函数CBase1( int )!\n";}
~CBase1( ){cout<<"调用析构函数~CBase1( )!\n";}
};
class CBase2
{
int y;
public:
CBase2( )
{y=0 ;cout<<"调用构造函数CBase2( )!\n";}
CBase2(int a)
{y=a ;cout<<"调用构造函数CBase2(int )!\n";}
~CBase2(){cout<<"调用析造函数~CBase2( )!\n";}
};
class A
{
int x;
public:
A () {x=0 ; cout<<"调用构造函数A( )!\n";}
A(int a){x=a;cout<<"调用构造函数A(int )!\n";}
~A(){cout<<"调用析构函数~A()!\n";}
};
class CDerived:public CBase1, virtual public CBase2
{
A a;
public:
CDerived()
{cout<<"调用构造函数CDerived( )!\n";}
CDerived(int x,int y ,int z):a(x),CBase1(y),CBase2(z)
{cout<<"调用构造函数CDerived(int,int )!\n";}
~CDerived(){cout<<"调用析造函数~CDerived( )!\n";}
};
int main()
{
CDerived *d=new CDerived();
CDerived *dd=new CDerived(3,3,3);
delete d; //该语句实际是两条语句,delete d和~CDerived( ).
//d->~CDerived则是单纯的执行一条普通的成员函数,在遇到return后再一次执行析构函数
cout<<"main()函数结束!"<<endl;
delete dd;
return 0;
}