¿Por qué se necesitan las funciones virtuales en C++? Explica con un ejemplo
¡Hola! Acabo de empezar a estudiar C++ y estoy tratando de entender las funciones virtuales. Leí muchos artículos, pero aún no comprendo del todo para qué sirven.
Tengo una clase base `Animal` y clases derivadas `Dog` y `Cat`. Quiero que cada animal tenga su propio sonido. Sin funciones virtuales, escribí esto:
```cpp
class Animal {
public:
void speak() { cout << "Some animal sound\n"; }
};
class Dog : public Animal {
public:
void speak() { cout << "Woof!\n"; }
};
class Cat : public Animal {
public:
void speak() { cout << "Meow!\n"; }
};
```
Cuando creo objetos directamente, todo funciona:
```cpp
Dog dog;
Cat cat;
dog.speak(); // Woof!
cat.speak(); // Meow!
```
Pero si uso un puntero a la clase base, se llama al método de la clase base, no al de la derivada:
```cpp
Animal* ptr1 = new Dog();
Animal* ptr2 = new Cat();
ptr1->speak(); // Muestra "Some animal sound", pero debería ser "Woof!"
ptr2->speak(); // Muestra "Some animal sound", y de