我只是偶然發現了一個編譯錯誤,我想知道爲什麼發生這種情況。
代碼:虛擬功能通過多個接口訪問
struct Foo1
{
virtual int foo() = 0;
};
struct Foo2 : Foo1
{
virtual int foo(int i) = 0;
};
struct Bar : public Foo2
{
virtual int foo() { return 0; }
virtual int foo(int i) { return i; }
};
int main() {
Bar b;
Foo2* f2 = &b;
b.foo();
//f2->foo(); // this gives an error
return 0;
}
誤差在GCC 4.8.1是
error: no matching function for call to ‘Foo2::foo()’
我很奇怪,爲什麼編譯器無法看到Foo1::foo
功能? 我知道我可以通過在Foo2
類中添加using Foo1::foo
來解決這個問題,但任何人都可以給我一個參考標準,爲什麼編譯器無法自己找到函數?
這是正確的答案。這種現象也被稱爲「名稱隱藏」IIRC,基本上聲明如果在派生類中存在具有相同名稱的聲明,則隱藏基類中的聲明。這是設計來避免一些「人爲的」行爲。 –