Por favor, considere el siguiente código:sobrecargado llamada de función virtual resolución
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*)!
}
me interesa saber por qué C++ elige para resolver la llamada a la función en la última línea por upcasting la this
puntero del objeto a la base clase, en lugar de upcasting el argumento de f()
? ¿Hay alguna manera de que pueda obtener el comportamiento que quiero?
Gracias - según tengo entendido, el punto es que la resolución de qué virtual f() para llamar ocurre en tiempo de compilación, en función del argumento proporcionado a f(). Entonces en la última línea, el compilador ya ha decidido que se llamará f (A2 *). La versión de f (A2 *) llamada depende del tipo de tiempo de ejecución al que se apunta. Aquí, dado que la clase B1 no reemplaza a f (A2 *), se llama a la versión de la clase base. – stw
@stw, absolutamente correcto. –