簡體   English   中英

C++:繼承重載的非虛方法和虛方法都具有相同的名稱會導致問題

[英]C++: inheriting overloaded non-virtual method and virtual method both with the same name causes problem

我試圖將兩個具有不同參數列表的同名方法繼承到派生類。 其中一個是虛擬的並在派生類中被覆蓋,另一個是非虛​​擬的。 這樣做時,我在嘗試從派生類對象訪問基類的非虛擬方法時遇到編譯錯誤。

這是代碼片段

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;
}

這會產生以下編譯錯誤:

錯誤:沒有用於調用“Deriv::f()”的匹配函數
注意:候選人是: virtual void Deriv::f(int)

我不是 C++ 的專家,但直到現在我認為假設成員方法可以通過它們的簽名完全區分是正確的。 因此,非虛擬方法 Base::f() 不應被覆蓋並且應保持可訪問性。 我錯了嗎?

以下是一些有趣的/額外的評論:

    - 覆蓋方法 Deriv::f(int arg) 也可以是非虛擬的; 錯誤以任何一種方式發生
    - 錯誤消失/可以規避...
      ...通過將 Deriv 對象轉換為 Base 類
      ...在 Deriv 中不覆蓋 Base::f(int arg) 時
      ...通過添加命令“Base::f;” 到 Deriv 的公共部分

所以,既然我已經知道如何避免這個編譯錯誤,我主要感興趣的是為什么會發生這個錯誤!

Deriv ,添加以下內容:

using Base::f;

除了@DumbCoder 提供的鏈接之外,您還可以在我對類似問題的回答中找到更多詳細信息: Overriding a Base's Overloaded Function in C++

派生類函數隱藏了基函數定義。 關於原因方式的詳細解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM