单继承与基类的虚析构函数
测试一:
// 基类析构函数不是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,是为了实现:通过基类的指针去回收子类对象时,能保证子类对象的析构函数能被自动调用。