程序设计与算法(三)第06周测验003:这是什么鬼delete
【摘要】
程序设计与算法(三)第06周测验003:这是什么鬼delete
本文是中国大学MOOC,北京大学程序设计与算法(三)C++面向对象程序设计第六周测验。本课程学习的github仓库欢迎Fork
总时间限...
程序设计与算法(三)第06周测验003:这是什么鬼delete
本文是中国大学MOOC,北京大学程序设计与算法(三)C++面向对象程序设计第六周测验。本课程学习的github仓库欢迎Fork
总时间限制:
1000ms
内存限制:
65536kB
描述
程序填空输出指定结果
#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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
输入
无
输出
destructor B
destructor A
- 1
- 2
先看主函数
int main()
{
A * pa;
pa = new B;
delete pa;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
主函数新建了一个B
类对象,而B
类是A
的派生。后面又删除了B
类对象
再看看类
class A
{
public:
A() { }
// 在此处补充你的代码
};
class B:public A {
public:
~B() { cout << "destructor B" << endl; }
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
B
类里有一个析构函数。
继续看输出
destructor B
destructor A
- 1
- 2
明显是析构函数被调用了。
所以我们应该补上A
的析构函数。
但是,我们通过课程了解到
通过基类的指针删除派生类对象时,通常情况下只调用基类的析构函数。但是删除一个派生类对象时,应该先调用派生类的析构函数,然后调用基类的析构函数。这样会冲突
所以我们要把基类的析构函数声明为virtual
所以这个析构函数应该是虚析构函数
我们就可以这样写
virtual ~A(){cout << "destructor A" << endl;}
- 1
提交,通过
文章来源: blog.csdn.net,作者:沧夜2021,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/CANGYE0504/article/details/105362010
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)