构造函数:
生成对象时调用构造函数
生成派生类对象时先调用基类构造函数在调用派生类构造函数
#include <iostream>
using namespace std;
class base
{
public:
base(){cout<<"base"<<endl;}
virtual ~base(){}
};
class derived:public base
{
public:
derived(){cout<<"derived"<<endl;}
~derived(){}
};
int main()
{
base *point=new derived();
return 0;
}
输出结果为:
base
derived
析构函数:
撤销对象时调用析构函数
撤销派生类对象时,先调用派生类的析构函数再调用基类的析构函数。
#include <iostream>
using namespace std;
class base
{
public:
base(){}
//virtual ~base(){}
~base(){cout<<"base"<<endl;}
};
class derived:public base
{
public:
derived(){}
~derived(){cout<<"derived"<<endl;}
};
int main()
{
derived *p=new derived;
delete p;
return 0;
}
输出结果为:
derived
base
虚拟的析构函数:
基类指针指向派生类对象时,撤销指针
当基类析构函数不叫virtual关键字,则下列代码输出结果为base(只调用基类析构函数)
#include <iostream>
using namespace std;
class base
{
public:
base(){}
~base(){cout<<"base"<<endl;}//正常的析构函数
};
class derived:public base
{
public:
derived(){}
~derived(){cout<<"derived"<<endl;}
};
int main()
{
base *point=new derived();
delete point;
return 0;
}
基类指针指向派生类对象时,
当基类析构函数加virtual关键字时,撤销指针先调用派生类析构函数再调用基类析构函数
输出结果:
derived
base
#include <iostream>
using namespace std;
class base
{
public:
base(){}
virtual ~base(){cout<<"base"<<endl;}//虚拟的析构函数
};
class derived:public base
{
public:
derived(){}
~derived(){cout<<"derived"<<endl;}
};
int main()
{
base *point=new derived();
delete point;
return 0;
}