虚拟析构函数的调试结果为什么跟理论不符?
#include <iostream>
using namespace std;
class AA
{
public:
AA()
{
cout < < "A construct " < <endl;
}
virtual ~AA()
{
cout < < "A destruct " < <endl;
}
};
class BB : public AA
{
public:
BB()
{
cout < < "B construct " < <endl;
}
~BB()
{
cout < < "B destruct " < <endl;
}
};
void main()
{
AA* aa=new BB();
delete aa;
}
当基类的析构是虚拟的时候,输出的是
A construct
B construct
B destruct
A destruct ,
当把virtual去掉的时候,输出的是
A construct
B construct
A destruct
可是理论上应该分别是
A construct
B construct
B destruct
和
A construct
B construct
B destruct
A destruct
呀,这是为什么?
[解决办法]
输出的是对的,不知道你的理论是怎么出来的.
当析构函数未被声明为虚拟的时候,用基类指针删除派生类对象会导致只有基类部分被删除,资源泄漏,所以就应该只有A的destruct.
而声明为虚拟时,一个派生类的基类部分总是最先被构造,最后被析构,所以先是B被析构,然后是A
[解决办法]
理论上应该是
A construct
B construct
B destruct
这种解释:理论是怎么说的?
[解决办法]
去看《深度探索C++对象模型》
输出结果已经明确表明,你的理论是错的。
[解决办法]
派生类指针无法指向基类对象
而基类指针既能指向基类对象,也能指向派生类对象,这样才能实现多态性
比如BB和CC都派生于AA,那么P-> FUN()当指针P指向BB时就是BB::FUN(),指向CC时就是CC::FUN(),依次类推
[解决办法]
AA* aa=new BB();的优势在哪里?
接口/数据存取上的优势