Определение метода в Derived
скрывает определение в Base
. Чтобы избежать этого, добавьте using Base::method;
к Derived
.
Это происходит потому, что при вызове функций в Derived
компилятор просматривает Base
только в том случае, если он не точил имя в Derived
. Обратите внимание, что он не ищет подпись , а только имя на этом этапе. Разрешение перегрузки на основе подписи выполняется только после этого. На самом деле это не сильно отличается от следующей ситуации:
void function(int);
void function();
int main()
{
void function(); // this declaration hides *both* global declarations
function(3); // error
}
В вашем случае Base
играет роль глобальной области видимости, а Derived
- роль области действия функции.
Также обратите внимание, что это не связано с виртаульскими функциями; действительно, то же самое произошло бы и без virtual
(за исключением того, что вы, конечно, не могли бы вызвать Derived
method
через указатель на Base
, конечно, но вместо этого вызывали бы версию Base
).