程序設計與算法(三)第06周測驗001 看上去像多態
本文是中國大學MOOC,北京大學程序設計與算法(三)C++面向對象程序設計第六週測驗。本課程學習的github倉庫歡迎Fork
-
總時間限制:
1000ms
-
內存限制:
65536kB
-
描述
程序填空產生指定輸出
#include <iostream> using namespace std; class B { private: int nBVal; public: void Print() { cout << "nBVal="<< nBVal << endl; } void Fun() {cout << "B::Fun" << endl; } B ( int n ) { nBVal = n;} }; // 在此處補充你的代碼 int main() { B * pb; D * pd; D d(4); d.Fun(); pb = new B(2); pd = new D(8); pb -> Fun(); pd->Fun(); pb->Print (); pd->Print (); pb = & d; pb->Fun(); pb->Print(); return 0; }
-
輸入
無
-
輸出
D::Fun B::Fun D::Fun nBVal=2 nBVal=24 nDVal=8 B::Fun nBVal=12
先看主函數:
int main() {
B * pb; D * pd; //定義了B類對象pb,D類對象pd
D d(4); d.Fun(); //構造函數D.d()
pb = new B(2); pd = new D(8);
pb -> Fun(); pd->Fun(); //函數Fun()
pb->Print (); pd->Print (); //函數Print()
pb = & d; pb->Fun();
pb->Print();
return 0;
}
再看看類定義
class B {
private:
int nBVal;
public:
void Print()
{ cout << "nBVal="<< nBVal << endl; }
void Fun()
{cout << "B::Fun" << endl; }
B ( int n ) { nBVal = n;}
};
所以我們要寫一個D
類,這個類應該是B類的派生類。因爲兩個類的函數名都一樣。
再看看輸出:
D::Fun //d.Fun()輸出
B::Fun //pb-->Fun()
D::Fun //pd-->Fun()
nBVal=2 //pb-->Print()
nBVal=24
nDVal=8
B::Fun //pb-->Fun()
nBVal=12 //pb-->Print()
nBVal=24
與 nDVal=8
有點迷。
根據程序執行的順序與輸出對應,我們猜測pd-->Fun()
應該會調用一次B
類的Print()
所以,接下來就清楚了。我們可以這樣寫。
class D:public B
{
private:
int nDVal;
public:
void Fun()
{
cout << "D::Fun" << endl;
}
void Print()
{
B::Print();
cout << "nDVal=" << nDVal << endl;
}
D(int nDval_) :nDVal(nDval_),B(3*nDval_){};
};
提交,通過。