Si prega di considerare il seguente codice:overload chiamata di funzione virtual risoluzione
class Abase{};
class A1:public Abase{};
class A2:public A1{};
//etc
class Bbase{
public:
virtual void f(Abase* a);
virtual void f(A1* a);
virtual void f(A2* a);
};
class B1:public Bbase{
public:
void f(A1* a);
};
class B2:public Bbase{
public:
void f(A2* a);
};
int main(){
A1* a1=new A1();
A2* a2=new A2();
Bbase* b1=new B1();
Bbase* b2=new B2();
b1->f(a1); // calls B1::f(A1*), ok
b2->f(a2); // calls B2::f(A2*), ok
b2->f(a1); // calls Bbase::f(A1*), ok
b1->f(a2); // calls Bbase::f(A2*), no- want B1::f(A1*)!
}
mi interessa sapere il motivo per cui C++ sceglie di risolvere la chiamata di funzione sull'ultima riga dal upcasting il puntatore this
dell'oggetto alla base classe, piuttosto che upcasting l'argomento di f()
? C'è un modo per ottenere il comportamento che voglio?
Grazie - a quanto ho capito il punto è che la risoluzione di quale virtuale f() chiamare avviene al momento della compilazione, in base all'argomento fornito a f(). Quindi, sull'ultima riga, il compilatore ha già deciso che f (A2 *) sarà chiamato. La versione di f (A2 *) richiamata dipende dal tipo di runtime puntato. Qui, poiché la classe B1 non ha la funzione f (A2 *), viene chiamata la versione della classe base. – stw
@stw, assolutamente corretto. –