我有一個頭冷,所以它可能是我只是太擁塞瞭解這裏發生了什麼,但我不明白如何不編譯?C++函數重載(瞭解爲什麼這種情況是不明確的)
#include <string>
#include <iostream>
class Base {
public:
virtual void foo(const std::string & data) {
foo(data.data(), data.size());
}
virtual void foo(const void * bytes, int size) = 0;
};
class Derived : public Base{
public:
virtual void foo(const void * bytes, int size) {
std::cout << "Num Bytes: " << size << std::endl;
}
};
int main() {
Derived x;
std::string blah = "Hello";
x.foo(blah);
return 0;
}
我得到的錯誤是:
./foo.cpp: In function ‘int main()’:
./foo.cpp:25:15: error: no matching function for call to ‘Derived::foo(std::__cxx11::string&)’
x.foo(blah);
^
./foo.cpp:17:18: note: candidate: virtual void Derived::foo(const void*, int)
virtual void foo(const void * bytes, int size) {
^
./foo.cpp:17:18: note: candidate expects 2 arguments, 1 provided
如果我重新命名的foo
到fooString
第一個實例,然後一切工作如此看來的foo
二審以某種方式隱藏第一。但是,鑑於第二種情況有兩個參數而不是一個,我無法弄清楚它將如何模糊。
更新:它也能正常工作,沒有繼承(如果它是一個類),所以我懷疑我誤解了一些繼承規則。
http://stackoverflow.com/questions/4146499/why-does-a-virtual-function-get-hidden –
@latedeveloper謝謝,這很好地解釋它。 – Pace
工作'x.Base :: foo(blah);' –