c++編程練習 025:這是什麼鬼delete

北大程序設計與算法(三)測驗題彙總(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;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章