Claro.
En este caso en concreto no se ejecuta por 2 motivos:
- La variable creada es del tipo de la struct derivada. Entonces se llama a la función definida ahí.
- Una función virtual se define así para eso, para poder llamar a la función más adecuada en tiempo de ejecución
Si creas las funciones sin usar virtual, se decide en tiempo de compilación a qué función llamar:
struct Base {
void show(){
cout << "Base" << endl;
}
};
struct Derived : Base {
void show(){
cout << "Derived" << endl;
}
};
int main(){
Base b;
b.show(); // b es de tipo Base, se muestra: Base
Derived d;
d.show(); // d es de tipo Derived, se muestra: Derived
// LA DIFERENCIA ESTA AQUI:
Base *p = &b;
p->show(); // El puntero es de tipo Base, se muestra: Base
p = &d;
p->show(); // El puntero sigue siendo de tipo Base, se muestra: Base
}
En cambio, si definimos la función como virtual:
struct Base {
virtual void show(){
cout << "Base" << endl;
}
};
struct Derived : Base {
void show(){
cout << "Derived" << endl;
}
};
int main(){
Base b;
b.show(); // b es de tipo Base, se muestra: Base
Derived d;
d.show(); // d es de tipo Derived, se muestra: Derived
// LA DIFERENCIA ESTA AQUI:
Base *p = &b;
p->show(); // La variable a la que apunta es de tipo base, se muestra: Base
p = &d;
p->show(); // La variable a la que apunta es de tipo derived, se muestra: Derived
}
No sé si se ve bien. La diferencia es que si la función es virtual, en tiempo de ejecución se comprueba de qué tipo es la variable a la que está apuntando un puntero y se utiliza su función correspondiente. Si no se usa virtual, el compilador coge el tipo del puntero y llama a la función de su clase sin importarle de qué clase es la variable a la que apunta.