[英]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
,添加以下內容:
using Base::f;
除了@DumbCoder 提供的鏈接之外,您還可以在我對類似問題的回答中找到更多詳細信息: Overriding a Base's Overloaded Function in C++
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.