Короткий ответ, "потому что это - то, как разрешение перегрузки работает в C++".
компилятор ищет функции F в классе C, и если он находит кого-либо, он останавливает поиск и пытается выбрать кандидата среди тех. Это только смотрит в базовых классах, если никакие функции соответствия не были найдены в производном классе.
Однако можно явно ввести функции базового класса в пространство имен производного класса:
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
};
Похоже, что документации очень мало, особенно по драйверам. поговорил со знакомым мне давним разработчиком ядра Linux, и он посоветовал по существу взглянуть на код других драйверов.
я нашел некоторые справочные материалы: Grant Likely презентация , Grant Likely Linux Symposium paper, довольно хороший обзор структуры данных.
Обнаружено наиболее распространенное использование открытой системы микропрограмм в драйверах Freescale fsl_x.c в arch / powerpc / tree в ядре Linux, более поздних, чем 2.6.16.