025:这是什么鬼delete
题面
描述
程序填空输出指定结果
#include <iostream>
using namespace std;
class A
{
public:
A() { }
// 在此处补充你的代码
};
class B:public A {
public:
~B() { cout << "destructor B" << endl; }
};
int main()
{
A * pa;
pa = new B;
delete pa;
return 0;
}
输入
无
输出
destructor B
destructor A
思路
为什么会输出?
destructor B
destructor A
而且他的指针是A*的还能这样输出呢?
这里考到了基类的虚析构函数,如果基类的析构函数是虚函数那么他会先调用派生类的析构函数再调用基类的析构函数,所以就产生了这种结果。
#include <iostream>
using namespace std;
class A
{
public:
A() { }
virtual ~A() {
cout << "destructor A" << endl;
}
};
class B:public A {
public:
~B() { cout << "destructor B" << endl; }
};
int main()
{
A * pa;
pa = new B;
delete pa;
return 0;
}
如果不是基类的指针而是自己的指针那么他的输出也是正常。
#include <iostream>
using namespace std;
class A
{
public:
A() { }
~A() {
cout << "destructor A" << endl;
}
};
class B:public A {
public:
~B() { cout << "destructor B" << endl; }
};
int main()
{
B * pb;
pb = new B;
delete pb;
return 0;
}