2013-07-01 244 views
0

我有一個問題(我家庭作業的一部分),它不確定代碼的行爲。C++繼承函數覆蓋

我得到了一個class Father,它擁有一個函數「A」,函數「A」打印出「Hello Father」。
我得到了第二課 - >class son:public Father,它不具有功能「A」。
我得到了第三課 - >class grandson:public son,它擁有打印「你好孫子」的功能「A」。

功能「A」不是虛擬的。 請忽略編譯錯誤,我不想在這裏放80行代碼。

我有另一個功能:

void justPrint(const son& a) { 
    a.A; 
} 

現在,將在下面的電話進行打印:

grandson jeff; 
justPrint(jeff); 

我有點糊塗了,兒子不具備打印功能( A),所以他假設打電話給父親:: A(兒子是父親..)
但是,我們發送傑夫(孫子)的功能,接收兒子..和孫子是兒子..

我認爲它會打印

「你好父」

但我很困惑...將appericiate任何幫助和explenation ..

第二件事, 如果我將進行以下呼叫會發生什麼情況:

justPrint(1); 
+1

您是否嘗試過這些看到真正的輸出? – billz

+1

其實所描述的'justPrint'函數不會編譯 - 或者至少它不會調用函數'A'。而'justPrint(1)',假設只有上面的函數也不會編譯(因爲'1'不是一個有效的類'子對象)。 –

+2

爲了能夠回答這個問題(忽略上面提到的錯誤),我們需要知道父類中的函數'A'是否是虛擬的。 –

回答

2

我試圖作一個簡短的代碼來解決你的問題,但我沒有它(使用「G ++ TEST.CPP -fpermissive」編譯)

#include <iostream> 

using namespace std; 

class Father 
{ 
    public: 
    void A(){ 
     cout<<"Hello Father"<<endl; 
    } 
}; 

class Son : public Father 
{ 
}; 

class GrandSon : public Son 
{ 
    public: 
    void A() 
    { 
     cout<<"Hello GrandSon"<<endl; 
    } 
}; 

void justPrint(const Son& a) 
{ 
    a.A(); 
} 

int main(int argc, char* argv[]) 
{ 
    GrandSon jeff; 
    justPrint(jeff); 
    return 0; 
} 

也許你已經把在私人的?


輸出: 你好父親

+0

嗨,這是我認爲它應該打印的內容(正如你在我的答案中看到的那樣),但是我不確定。 –

+0

這是因爲你使用「兒子:公共父親」來建立兒子。因此,兒子擁有父親擁有的所有公共方法(包括A())。 Morover,Son沒有A(),所以它使用繼承樹,並採用相同簽名的第一個「A」(這裏是Father :: A)。 – Krozark

0
void justPrint(const son& a) { 
    a.A; 
} 

justPrint(1); if Class son contains single argument constructor with int as i/p.It will call that . 
+0

類的子包含一個參數構造函數。 你能解釋一下爲什麼會這麼叫嗎? –

+0

它會被調用,如果它需要一個int,除非你明確地標記 – doctorlove

+0

如果它需要一個double? –