c++编程练习 025:这是什么鬼delete
程序员文章站
2024-03-17 19:34:10
...
北大程序设计与算法(三)测验题汇总(2020春季)
描述
程序填空输出指定结果
#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
来源
Guo Wei
分析
根据输出结果,此处就是简单的析构函数在继承函数中的调用顺序的考察,我们知道一般析构顺序是派生类到基类,但是如果是基类的指针指向派生类,如果基类的析构函数不设置为虚函数,那么就程序就只会调用基类的析构函数,不会调用派生类的析构函数,
如下:
#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()
{
A * pa;
pa = new B;
delete pa;
return 0;
}
所以将基类的析构函数设置为虚函数即可。
如下:
#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 * pa;//此处是B类指针,就没有设虚函数的烦恼
pa = new B;
delete pa;
return 0;
}