Les fonctions virtuelles C++ permettent une programmation polymorphe grâce à la répartition dynamique, et son évolution comprend : des pointeurs virtuels, des tables de fonctions virtuelles, une répartition dynamique, des informations de type d'exécution (RTTI). Dans le cas réel, le comportement de répartition dynamique de différents types d'animaux est démontré à travers la relation d'héritage de la classe animale et de la fonction virtuelle speak(). Les fonctions virtuelles continuent d'évoluer en C++, augmentant l'efficacité et la flexibilité de la programmation polymorphe et devenant une fonctionnalité clé pour permettre un code robuste et évolutif.
L'histoire évolutive des fonctions virtuelles en C++ : l'origine et le changement de la programmation polymorphe
Introduction
Les fonctions virtuelles sont une caractéristique clé de la programmation polymorphe en C++, qui permettent de modifier des sous-classes d'objets sans modification Redéfinir son comportement sans utiliser le code de la classe de base. Cet article retracera l'origine des fonctions virtuelles, discutera de leur évolution en C++ et démontrera leur application à travers des cas pratiques.
Origine : Principe de substitution de Liskov
Le concept de programmation polymorphe a été proposé pour la première fois par Barbara Liskov en 1987 dans son célèbre principe de substitution de Liskov. Ce principe stipule que n'importe quelle sous-classe peut remplacer sa superclasse sans modifier l'exactitude du programme.
Premières implémentations C++ : pointeurs virtuels
Dans les premières versions de C++, les fonctions virtuelles étaient implémentées via des tables de pointeurs virtuels. Chaque objet contient un pointeur vers une table de pointeurs virtuels, qui stocke des pointeurs vers chacune de ses fonctions virtuelles. Lorsqu'une fonction virtuelle est appelée, le compilateur utilise cette table de pointeurs pour trouver l'adresse correcte de la fonction et l'exécuter.
Introduction de la table de fonctions virtuelles
C++ 2.0 introduit la table de fonctions virtuelles, qui est un moyen plus efficace d'implémenter des fonctions virtuelles. La table de fonctions virtuelles est un tableau qui stocke les pointeurs de fonctions virtuelles de tous les objets. L'objet appelle sa fonction virtuelle en indexant dans ce tableau, évitant ainsi la surcharge liée à la recherche de la table de pointeurs virtuels.
Répartition dynamique
La répartition dynamique est l'une des fonctionnalités clés des fonctions virtuelles. Il permet à un objet d'appeler la version correcte d'une fonction virtuelle au moment de l'exécution en fonction de son type réel. Ceci est accompli en stockant un pointeur vers la table virtuelle correcte dans la table d'objets de l'objet lors de sa création.
RTTI (Run-Time Type Information)
Run-time Type Information (RTTI) permet à un programme de déterminer le type d'un objet au moment de l'exécution. Cela permet aux programmes d'écrire du code robuste qui se comporte différemment selon le type d'objet. En C++, RTTI est implémenté via les opérateurs typeid
et dynamic_cast
. typeid
和 dynamic_cast
操作符来实现。
实战案例:动物花园模拟
考虑一个模拟动物园的程序。每个动物类都从一个基类 Animal
派生,它定义了所有动物共享的共同行为 (eat()
和 sleep()
)。不同种类的动物可以定义自己的 speak()
Cas pratique : Simulation de jardin d'animaux
Considérons un programme qui simule un zoo. Chaque classe Animal dérive d'une classe de base Animal
, qui définit des comportements communs partagés par tous les animaux (eat()
et sleep()
). Différentes espèces d'animaux peuvent définir leurs propres méthodes speak()
, dont le comportement diffère selon le type d'animal.
class Animal { public: virtual void eat() = 0; virtual void sleep() = 0; }; class Dog : public Animal { public: void eat() override { cout << "Dog eating" << endl; } void sleep() override { cout << "Dog sleeping" << endl; } void speak() { cout << "Woof!" << endl; } }; class Cat : public Animal { public: void eat() override { cout << "Cat eating" << endl; } void sleep() override { cout << "Cat sleeping" << endl; } void speak() { cout << "Meow!" << endl; } };
int main() { Animal* dog = new Dog(); Animal* cat = new Cat(); dog->speak(); // 输出 "Woof!" cat->speak(); // 输出 "Meow!" return 0; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!