程序設計與算法(三)第06周測驗003:這是什麼鬼delete

程序設計與算法(三)第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;
}

輸入

輸出

destructor B
destructor A

先看主函數

int main() 
{ 
	A * pa; 
	pa = new B; 
	delete pa; 
	return 0;
}

主函數新建了一個B類對象,而B類是A的派生。後面又刪除了B類對象

再看看類

class A 
{ 
public:
	A() { }
// 在此處補充你的代碼
}; 
class B:public A { 
	public: 
	~B() { cout << "destructor B" << endl; } 
}; 

B類裏有一個析構函數。

繼續看輸出

destructor B
destructor A

明顯是析構函數被調用了。

所以我們應該補上A的析構函數。

但是,我們通過課程瞭解到

通過基類的指針刪除派生類對象時,通常情況下只調用基類的析構函數。但是刪除一個派生類對象時,應該先調用派生類的析構函數,然後調用基類的析構函數。這樣會衝突

所以我們要把基類的析構函數聲明爲virtual

所以這個析構函數應該是虛析構函數

我們就可以這樣寫

virtual ~A(){cout << "destructor A" << endl;} 

提交,通過

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