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