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