2011-03-17 88 views
7
#include <iostream> 
#include <vector> 
using namespace std; 

class Base 
{ 
public: 
     void Display(void) 
     { 
      cout<<"Base display"<<endl; 
     } 

     int Display(int a) 
     { 
      cout<<"Base int display"<<endl; 
      return 0; 
     } 

}; 

class Derived : public Base 
{ 
public: 

     void Display(void) 
     { 
      cout<<"Derived display"<<endl; 
     } 
}; 


void main() 
{ 
    Derived obj; 
    obj.Display(); 
    obj.Display(10); 
} 

$test1.cpp: In function ‘int main()’: 
test1.cpp:35: error: no matching function for call to ‘Derived::Display(int)’ 
test1.cpp:24: note: candidates are: void Derived::Display() 

在註釋掉obj.Display(10),它的工作原理。下面的代碼有什麼問題?這不是編譯

+0

您正在使用什麼編譯器?它看起來像'gcc',但這是最近的代碼嗎?爲什麼你得到'$ test1.cpp:在函數'int main()':'中,即使你將main定義爲void main()'?用gcc和vC++試用了 – Muggen 2011-03-17 08:09:49

+0

。從vC++編輯器複製代碼,粘貼gcc輸出。 – 2011-03-17 08:14:11

回答

2

你需要的地方 -

using Base::Display ; // in Derived class 

如果一個方法的名稱在Derived類匹配,編譯器不會看到Base類。所以,爲了避免這種行爲,請將using Base::Display;。然後,編譯器會查看Base類,如果有任何方法實際上可以採用int作爲Display的參數。

class Derived : public Base 
{ 
    public: 
    using Base::Display ; 
    void Display(void) 
    { 
     cout<<"Derived display"<<endl; 
    } 
}; 
+1

這是編譯器特定的東西嗎? – 2011-03-17 08:06:50

+1

它與使用。你能不能解釋我在沒有使用的情況下發生了什麼? – 2011-03-17 08:08:12

+0

不應該int Display(int)無論如何都被派生出來,因爲它被聲明爲public。 – 2011-03-17 08:10:07

3

您需要使用using聲明。一個名爲f的成員函數X隱藏所有其他成員名爲f的基類中的X

爲什麼?

this explanation通過AndreyT

您可以通過使用using聲明中那些隱藏的名字帶來:

using Base::Display就是你需要在派生類中包含。

此外void main()是非標準的。使用int main()

+2

他將main定義爲void main(),但他如何獲得'$ test1.cpp:在函數'int main()':'? – Muggen 2011-03-17 08:07:28

+5

@Muggen:將'main'聲明爲除int之外的其他類型的返回類型是非法的。這個特定的實現似乎只是忽略了這個錯誤,並將代碼視爲正確聲明瞭「main」。 – 2011-03-17 08:11:18