Рассмотрим два случая в отдельности.Заменив #include
содержимым заголовка, мы сначала получаем:
struct B {};
struct D : B {};
void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }
Возможны две перегрузки.Поскольку D
наследуется от B
, то D*
неявно преобразуется в B*
.Из B*
и void*
первое лучше подходит, так что выбирается перегрузка.Но в случае форварда, объявленного B
и D
:
struct B;
struct D;
void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }
D
, как известно, не наследуется от B
, поэтому неявное преобразование из D*
в * невозможно1019 *.Единственная соответствующая перегрузка - f(void*)
.