6w4:第六週程式填空題1
阿新 • • 發佈:2019-01-07
描述
下面程式的輸出結果是:
A::Fun
C::Do
請填空:
#include <iostream> using namespace std; class A { private: int nVal; public: void Fun() { cout << "A::Fun" << endl; } 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() { C c; Call(c); return 0; }
輸入無輸出A::Fun
C::Do樣例輸入
無
樣例輸出
A::Fun C::Do
Code:
#include <iostream> using namespace std; class A { private: int nVal; public: void Fun() { cout << "A::Fun" << endl; } 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( // 在此處補充你的程式碼 B& p ) { p.Fun(); p.Do(); } int main() { C c; Call(c); return 0; }
Analysis:
隨便寫了一下就提交了,沒想到能過。
main中Call中的實參是C類的引用,但是根據輸出的結果來看,Call函式中並不是傳入C類的物件。就三個類,一個一個的試也能使出結果來。
之所以填B類的引用是因為B類中有一個虛擬函式Do()但是沒有Fun函式,所以在Call中呼叫Fun函式是會呼叫B的基類(A類)的Fun函式。呼叫Do時,因為B類中有一個Do的虛擬函式,呼叫用的時候會使用到多型的機制,因為傳進來的是C類的物件所以呼叫時呼叫C類中的Do函式。