简短的回答是"因为这就是重载解析在C++中的工作原理".
编译器在C类中搜索函数F,如果找到任何函数,它将停止搜索,并尝试在这些函数中选择一个候选者.如果在派生类中找不到匹配的函数,它只查看基类内部.
但是,您可以将基类函数显式引入派生类的命名空间:
struct C : public B { void f(void*) {} using B::f; // Add B's f function to C's namespace, allowing it to participate in overload resolution };