欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

c++编程练习 025:这是什么鬼delete
所以将基类的析构函数设置为虚函数即可。
如下:

#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;
}

c++编程练习 025:这是什么鬼delete

相关标签: c++编程练习 c++