Para que servem as funções virtuais em C++? Explique com um exemplo
Olá! Acabei de começar a estudar C++ e estou tentando entender as funções virtuais. Li muitos artigos, mas ainda não compreendo totalmente para que elas servem.
Eu tenho uma classe base `Animal` e classes derivadas `Dog` e `Cat`. Quero que cada animal tenha seu próprio som. Sem funções virtuais, escrevi assim:
```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"; }
};
```
Quando crio objetos diretamente, tudo funciona:
```cpp
Dog dog;
Cat cat;
dog.speak(); // Woof!
cat.speak(); // Meow!
```
Mas se eu usar um ponteiro para a classe base, o método da classe base é chamado, e não o da classe derivada:
```cpp
Animal* ptr1 = new Dog();
Animal* ptr2 = new Cat();
ptr1->speak(); // Exibe "Some animal sound", mas deveria ser "Woof!"
ptr2->speak(); // Exibe "Some animal sound", mas d