Maison  >  Article  >  développement back-end  >  Le secret des fonctions virtuelles C++ révélé

Le secret des fonctions virtuelles C++ révélé

WBOY
WBOYoriginal
2024-04-19 09:18:01368parcourir

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.

C++ 虚函数的奥秘揭晓

Le secret des fonctions virtuelles C++ révélé

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.

Comment fonctionnent les fonctions virtuelles

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.

Avantages des fonctions virtuelles

Les avantages des fonctions virtuelles incluent :

  • Extensibilité : Vous pouvez ajouter de nouvelles fonctionnalités au code existant sans avoir à modifier le code de la classe de base.
  • Réutilisabilité : Vous pouvez partager du code commun tout en permettant aux classes dérivées de personnaliser leur comportement.
  • Polymorphisme : Les fonctions virtuelles sont la base pour réaliser le polymorphisme, de sorte que les objets peuvent appeler des méthodes de manière uniforme, même s'il s'agit d'objets de types différents.

Inconvénients des fonctions virtuelles

Les fonctions virtuelles présentent également certains inconvénients, notamment :

  • Surcharge : La création et la recherche de la table de fonctions virtuelles entraîneront une certaine surcharge d'exécution.
  • Complexité : La compréhension et le débogage du code des fonctions virtuelles peuvent être complexes.

Cas pratique

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()CircleSquare 派生类覆盖了这些函数,为每种形状提供了特定的实现。

main()

La fonction 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn