Je suis une C++ débutant moi-même, mais voici comment je m'y compris non seulement que les fonctions virtuelles sont, mais pourquoi ils sont requis:
Disons que vous disposez de ces deux classes:
class Animal
{
public:
void eat() { std::cout << "I'm eating generic food."; }
}
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
}
Dans votre fonction principale:
Animal *animal = new Animal;
Cat *cat = new Cat;
animal->eat(); // outputs: "I'm eating generic food."
cat->eat(); // outputs: "I'm eating a rat."
Jusqu'ici tout va bien, non? Les animaux mangent les génériques de la nourriture, les chats mangent des rats, sans virtual
.
Nous allons changer un peu maintenant de sorte que eat()
est appelé par le biais d'un intermédiaire de la fonction (un triviaux de la fonction juste pour cet exemple):
//this can go at the top of the main.cpp file
void func(Animal *xyz) { xyz->eat(); }
Maintenant notre fonction principale est:
Animal *animal = new Animal;
Cat *cat = new Cat;
func(animal) // outputs: "I'm eating generic food."
func(cat) // outputs: "I'm eating generic food."
Uh oh...nous avons passé un Chat en func()
, mais il l'habitude de manger des rats. Si vous surcharge func()
donc il faut un Chat* ? Si vous avez à tirer plus d'animaux de l'Animal, ils seraient tous besoin de leur propre func()
.
La solution est de faire eat()
une fonction virtuelle:
class Animal
{
public:
virtual void eat() { std::cout << "I'm eating generic food."; }
}
Principales:
func(animal) // outputs: "I'm eating generic food."
func(cat) // outputs: "I'm eating a rat."
Fait.