现在的位置: 首页 > 综合 > 正文

基类的虚析构函数

2013年09月14日 ⁄ 综合 ⁄ 共 2305字 ⁄ 字号 评论关闭

 单继承与基类的虚析构函数

测试一:

// 基类析构函数不是virtual

class base

{

public:

         base()

         {

                   cout<< "base constructor" << endl;

         }

         ~base()

         {

                   cout<< "base destructor" << endl;

         }

 

         //virtualvoid dosomething(){}

};

 

// 单继承

class demo: public base

{

public:

         demo()

         {

                   cout<< "demo constructor" << endl;

         }

         ~demo()

         {

                   cout<< "demo destructor" << endl;

         }

};

 

int main(int argc, char* argv[])

{

         base*p = new demo;

         deletep;

         cout<< "end" << endl;

 

         return0;

}

 

输出:

结论:

基类的析构函数非virtual时,delete基类指针,不会调用子类的析构函数

测试2:

// 基类析构函数是virtual

class Vbase

{

public:

         Vbase()

         {

                   cout<< "Vbase constructor" << endl;

         }

         virtual~Vbase()

         {

                   cout<< "Vbase destructor" << endl;

         }

};

// 单继承

class demo: public Vbase

{

public:

         demo()

         {

                   cout<< "demo constructor" << endl;

         }

         ~demo()

         {

                   cout<< "demo destructor" << endl;

         }

};

 

int main(int argc, char* argv[])

{

         Vbase*p = new demo;

         deletep;

         cout<< "end" << endl;

 

         return0;

}

 

输出:

结论:

基类的析构函数是virtual时,delete基类指针,会调用子类的析构函数

 

多继承与基类的虚析构函数

 

背景代码

// 基类析构函数不是virtual

class base

{

public:

         base()

         {

                   cout<< "base constructor" << endl;

         }

         ~base()

         {

                   cout<< "base destructor" << endl;

         }

 

         //virtualvoid dosomething(){}

};

 

// 基类析构函数是virtual

class Vbase

{

public:

         Vbase()

         {

                   cout<< "Vbase constructor" << endl;

         }

         virtual~Vbase()

         {

                   cout<< "Vbase destructor" << endl;

         }

};

 

// 多继承,一个基类析构函数不是virtual,一个基类析构函数是virtual

class demo: public base, public Vbase

{

public:

         demo()

         {

                   cout<< "demo constructor" << endl;

         }

         ~demo()

         {

                   cout<< "demo destructor" << endl;

         }

};

 

测试1

void main()

{

         base*p = new demo;

         deletep;

         cout<< "end" << endl;

}

// 执行结果:

注意:没有输出最后一句的“end”,说明delete操作阻塞了(原因,暂时还不清楚)。

 

把base类中注释掉的方法:

virtual void dosomething(){}

放出来,重新执行,输出(原因,暂时还不清楚):

 

结论:

被delete的基类,其析构函数非virtual时,不会调用子类的析构函数

 

测试2

void main()

{

         Vbase*p = new demo;

         deletep;

         cout<< "end" << endl;

}

执行结果:

结论:

被delete的基类,其析构函数是virtual时,会调用子类的析构函数

 

综上:

之所以基类的析构函数大多数情况都是virtual,是为了实现:通过基类的指针去回收子类对象时,能保证子类对象的析构函数能被自动调用。

抱歉!评论已关闭.