Jeśli mam kod jak poniżej:C++ funkcja członek wirtualnym override i przeciążenie jednocześnie
struct A {
virtual void f(int) {}
virtual void f(void*) {}
};
struct B : public A {
void f(int) {}
};
struct C : public B {
void f(void*) {}
};
int main() {
C c;
c.f(1);
return 0;
}
pojawia się błąd, który mówi, że próbuję zrobić nieprawidłowy konwersji z int do void *. Dlaczego kompilator nie może stwierdzić, że musi wywołać B :: f, ponieważ obie funkcje są zadeklarowane jako wirtualne?
Po przeczytaniu odpowiedzi Jalfa poszedłem i zmniejszyłem ją jeszcze bardziej. Ten nie działa tak dobrze. Niezbyt intuicyjny.
struct A {
virtual void f(int) {}
};
struct B : public A {
void f(void*) {}
};
int main() {
B b;
b.f(1);
return 0;
}
chcieć dodać link do C++ FAQ na funkcji ukrycia: http://www.parashift.com/c++-faq-lite/strange- inheritance.html # faq-23.9 – greyfade
@jalf: Jaki jest powód takiego zachowania kompilatora? Dlaczego nie szukać klas podstawowych dla funkcji dopasowanych do połączenia? – Andrew
Jaki byłby powód * tego *? Kompilator musi wybrać pewne zachowanie, co w niektórych przypadkach ma sens i wydaje się absurdalne w innych przypadkach. Zaletą tego schematu jest możliwość włączenia zachowania "kontynuuj wyszukiwanie". Ale gdyby tak było, nie byłoby sposobu, aby z niego zrezygnować i uzyskać * to * zachowanie. Pod koniec dnia projektanci języka musieli podjąć decyzję i wybrali to zachowanie. :) – jalf