У меня голова холодная, поэтому может быть, что я просто слишком перегружен, чтобы понять, что здесь происходит, но я не могу понять, как следующее не компилируется ?Перегрузка функции 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);' –