程序設計與算法(三)第06周測驗004:怎麼又是Fun和Do
本文是中國大學MOOC,北京大學程序設計與算法(三)C++面向對象程序設計第六週測驗。本課程學習的github倉庫歡迎Fork
總時間限制:
1000ms
內存限制:
65536kB
描述
程序填空輸出指定結果
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun()
{ cout << "A::Fun" << endl; };
virtual void Do()
{ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do()
{ cout << "B::Do" << endl;}
};
class C:public B {
public:
void Do( )
{ cout <<"C::Do"<<endl; }
void Fun()
{ cout << "C::Fun" << endl; }
};
void Call(
// 在此處補充你的代碼
) {
p->Fun(); p->Do();
}
int main() {
Call( new A());
Call( new C());
return 0;
}
輸入
無
輸出
A::Fun
A::Do
A::Fun
C::Do
先看主函數
int main() {
Call( new A());
Call( new C());
return 0;
}
emmm,兩個Call
函數,其中參數是新建的類A
和C
的對象
void Call(
// 在此處補充你的代碼
) {
p->Fun(); p->Do();
}
看看類
class A {
private:
int nVal;
public:
void Fun()
{ cout << "A::Fun" << endl; };
virtual void Do()
{ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do()
{ cout << "B::Do" << endl;}
};
class C:public B {
public:
void Do( )
{ cout <<"C::Do"<<endl; }
void Fun()
{ cout << "C::Fun" << endl; }
};
輸出是
A::Fun //A.Fun()輸出
A::Do //A.Do()
A::Fun //A.Fun()
C::Do //C.Do()
注意,主函數裏的Call
的參數是new
一個新的空間。所以我們必須用指針,不可以用&
。
但是這裏怎麼會出現A::Fun()
呢?
因爲我們看到Do()
函數是虛函數,A
,B
,C
類裏的Do
都是虛函數,所以哪個類運行的Do
函數,調用的就是哪個類的Do
。
Fun()
就不一樣了,只有在A
和C
中有。
想要輸出A::Fun()
,那麼我們只能這樣寫
A *p
即
void Call(A *p) {
p->Fun(); p->Do();
}
這樣寫的話,Do()
函數的調用是正常的。當Call( new C());
時,因爲指針是A *
,故調用的是A.Fun()
,與輸出相符
A * p
指向C
是可以的,因爲C
是A
的派生
提交,通過