6

我想繼承兩個具有不同參數列表的同名方法派生類。其中一個是虛擬的,在派生類中被重寫,另一個是非虛​​擬的。這樣做時,我在嘗試從派生類對象訪問基類的非虛方法時遇到編譯錯誤。C++:繼承重載的非虛擬方法和虛擬方法都具有相同的名稱導致問題

這裏是代碼片段

class Base { 
public: 
    void f() { 
     cout << "[Base::f()]" << endl; 
    } 

    virtual void f(int arg) { 
     cout << "[Base::f(" << arg << ")]" << endl; 
    } 
}; 


class Deriv : public Base { 
public: 
    virtual void f(int arg) { 
     cout << "[Deriv::f(" << arg << ")]" << endl; 
    } 
}; 


int main() { 
    Deriv d; 
    d.f(-1);  
    d.f(); // <<-- compile error 
    return 0; 
} 

產生以下編譯錯誤:

error: no matching function for call to ‘Deriv::f()’
note: candidates are: virtual void Deriv::f(int)

我不是在C++方面的專家,但是到現在爲止我認爲是正確的做出的假設該成員方法可以通過其簽名完全區分。因此,非虛方法Base :: f()不應被覆蓋,並應保持可訪問。我錯了嗎?

這裏有一些有趣的/其他評價:

    - 壓倒一切的方法DERIV :: F(INT ARG)可以是非虛擬爲好;在任一方式
    發生 錯誤 - 通過鑄造DERIV對象基類
    ...當不重寫基地:: F中的誤差消失/可以迴避...
      ...(INT ARG) in Deriv
      ...通過添加命令「Base :: f;」到DERIV

這樣的公共部分,因爲我已經知道如何避免這個編譯錯誤,我主要興趣在爲什麼這個錯誤發生!請幫我解釋一下...

謝謝了! EMME

+0

當你說「...通過將命令」Base :: f;「添加到Deriv的公共部分時,你的意思是'使用Base :: f;'?的 – Tomaka17 2010-08-04 14:32:48

+0

可能重複的[用C重寫一個基地的重載函數++](http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c) – 2010-08-04 14:39:02

+0

@ Tomaka17: 不,我的意思是精確地:放行 Base :: f; 。但顯然這與「使用..」命令相同。 – Emme 2010-08-04 14:57:38

回答

7

Deriv,補充一點:

using Base::f; 

除了由@DumbCoder給出的鏈接,你可以找到自己的答案更多的細節,一個類似的問題:Overriding a Base's Overloaded Function in C++

+0

是啊,我已經知道這一點(請參閱我的評論下面的代碼段)。但爲什麼必須添加這個,這是做什麼的? – Emme 2010-08-04 14:35:52

+0

好的,非常感謝你的這個鏈接!幫了很多! – Emme 2010-08-04 14:46:53