Se ho un codice come questo:funzione di membro C++ di override virtuale e di sovraccarico, allo stesso tempo
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;
}
ottengo un errore che dice che sto cercando di fare una conversione non valida da int a void *. Perché il compilatore non può capire che deve chiamare B :: f, dal momento che entrambe le funzioni sono dichiarate come virtuali?
Dopo aver letto la risposta di jalf sono andato e l'ho ridotto ulteriormente. Questo non funziona altrettanto bene. Non molto intuitivo.
struct A {
virtual void f(int) {}
};
struct B : public A {
void f(void*) {}
};
int main() {
B b;
b.f(1);
return 0;
}
Potrebbe desiderare di aggiungere un link al C++ FAQ sulla funzione nascondersi: http://www.parashift.com/c++-faq-lite/strange- inheritance.html # faq-23.9 – greyfade
@jalf: Qual è la ragione del comportamento di tale compilatore? Perché non cercare le classi base per le funzioni che si adattano alla chiamata? – Andrew
Quale sarebbe la ragione per * che *? Il compilatore deve scegliere un comportamento, e in alcuni casi questo ha senso, e sembra assurdo in altri. Il vantaggio di questo schema è che puoi attivare il comportamento di "continua ricerca". Ma se così fosse, non ci sarebbe alcun modo di rinunciare a questo e ottenere * questo * comportamento. Alla fine della giornata, i progettisti di linguaggi hanno dovuto prendere una decisione e hanno scelto questo comportamento. :) – jalf