Maison > Article > développement back-end > Le secret des fonctions virtuelles C++ révélé
Les fonctions virtuelles utilisent la liaison dynamique pour déterminer la fonction à appeler au moment de l'exécution pour obtenir le polymorphisme. Ses avantages incluent l’évolutivité et la réutilisabilité, mais cela introduit également des frais généraux et de la complexité. Les fonctions virtuelles sont souvent utilisées pour implémenter des méthodes de différents types d'objets de manière uniforme.
Les fonctions virtuelles sont un outil puissant en C++ qui vous permet de créer des méthodes qui peuvent être remplacées par des classes dérivées. Cela signifie que vous pouvez écrire le code de la classe de base, puis le personnaliser selon vos besoins dans les classes dérivées.
Les fonctions virtuelles utilisent une technique appelée liaison dynamique (également connue sous le nom de liaison tardive). Contrairement à la liaison statique (également appelée liaison anticipée), qui détermine la fonction à appeler au moment de la compilation, la liaison dynamique est déterminée au moment de l'exécution.
Cela signifie que lorsque vous appelez une fonction virtuelle, le compilateur génère un pointeur vers la table des fonctions virtuelles. Ce tableau contient des pointeurs vers les fonctions implémentées par chaque classe dérivée. Au moment de l'exécution, ce pointeur est utilisé pour sélectionner la fonction à appeler.
Les avantages des fonctions virtuelles incluent :
Les fonctions virtuelles présentent également certains inconvénients, notamment :
Considérons l'exemple suivant :
class Shape { public: virtual double area() = 0; // 纯虚函数 virtual double perimeter() = 0; // 纯虚函数 }; class Circle : public Shape { public: Circle(double radius) : _radius(radius) {} double area() override { return M_PI * _radius * _radius; } double perimeter() override { return 2 * M_PI * _radius; } private: double _radius; }; class Square : public Shape { public: Square(double side) : _side(side) {} double area() override { return _side * _side; } double perimeter() override { return 4 * _side; } private: double _side; }; int main() { Shape* shapes[] = { new Circle(5), new Square(3) }; for (Shape* shape : shapes) { std::cout << "Area: " << shape->area() << std::endl; std::cout << "Perimeter: " << shape->perimeter() << std::endl; } delete[] shapes; return 0; }
Dans cet exemple, la classe Shape
déclare deux fonctions virtuelles pures area()
et perimeter ( )
. Les classes dérivées Circle
et Square
remplacent ces fonctions, fournissant des implémentations spécifiques pour chaque forme. Shape
类声明了两个纯虚函数 area()
和 perimeter()
。Circle
和 Square
派生类覆盖了这些函数,为每种形状提供了特定的实现。
main()
main()
utilise la liaison dynamique pour appeler différentes fonctions virtuelles, selon le type de l'objet actuel. Cela nous permet d'utiliser une interface unifiée pour gérer différentes formes. 🎜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!