1. 程式人生 > >6w4:第六週程式填空題1

6w4:第六週程式填空題1

描述

下面程式的輸出結果是:

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函式。