Maison  >  Article  >  développement back-end  >  Fonctions virtuelles C++ et liaison dynamique : exploration des informations sur les types d'exécution

Fonctions virtuelles C++ et liaison dynamique : exploration des informations sur les types d'exécution

PHPz
PHPzoriginal
2024-04-28 11:21:02388parcourir

Les fonctions virtuelles C++ implémentent le polymorphisme, permettant aux classes dérivées de remplacer les fonctions. La liaison dynamique détermine la fonction à exécuter au moment de l'exécution, offrant ainsi une flexibilité. Les fonctions virtuelles sont déclarées avec le mot-clé virtual, permettant aux classes dérivées de les remplacer. La liaison dynamique se produit lorsque le moment de la compilation ne peut pas déterminer quelle fonction appeler, offrant ainsi une flexibilité d'exécution. L'exemple de hiérarchie de classes animales montre comment les fonctions virtuelles peuvent être utilisées pour appeler différentes méthodes en fonction du type d'objet. L'exemple de dessin graphique illustre comment la liaison dynamique peut être utilisée pour dessiner dynamiquement des objets en fonction de leur type.

C++ 虚拟函数与动态绑定:探索运行时类型信息

Fonctions virtuelles C++ et liaison dynamique : découvrir les secrets des informations de type d'exécution

Introduction

Les fonctions virtuelles sont un mécanisme puissant en C++ pour réaliser le polymorphisme et permettre différentes implémentations. L'objet de classe dérivée est appelé via le pointeur ou la référence de classe de base. Avec la liaison dynamique, la fonction à exécuter est déterminée au moment de l'exécution, ce qui offre une grande flexibilité.

Fonction virtuelle

Une fonction déclarée comme virtuelle est une fonction virtuelle, qui permet de remplacer la fonction dans les classes dérivées. Lorsqu'une fonction virtuelle est appelée via un pointeur ou une référence de classe de base, l'implémentation correspondant au type d'objet réel est appelée. virtual 的函数是一个虚拟函数,它允许函数在派生类中重写。当通过基类指针或引用调用虚拟函数时,将调用与实际对象类型对应的实现。

动态绑定

动态绑定是在运行时解析类型和调用相应函数的过程。当编译器不知道在编译时将调用哪个函数实现时,就会发生这种情况。动态绑定允许在程序执行时更改对象的类型,从而实现更大的灵活性。

实战案例 I:动物类层次结构

考虑以下动物类层次结构:

class Animal {
public:
    virtual void Speak();
};

class Dog : public Animal {
public:
    virtual void Speak() override;
};

class Cat : public Animal {
public:
    virtual void Speak() override;
};

每个类都声明一个虚拟函数 Speak(),可以在派生类中重写。

void Animal::Speak() {
    std::cout << "Animal speaks" << std::endl;
}

void Dog::Speak() {
    std::cout << "Dog barks" << std::endl;
}

void Cat::Speak() {
    std::cout << "Cat meows" << std::endl;
}

实战案例 II:图形绘制

动态绑定还可以用于实现图形应用程序中对象的动态绘制。考虑以下示例:

class Shape {
public:
    virtual void Draw();
};

class Rectangle : public Shape {
public:
    void Draw() override;
};

class Circle : public Shape {
public:
    void Draw() override;
};

void DrawShape(Shape& shape) {
    shape.Draw();
}

在这个例子中,DrawShape() 函数通过基类引用接收一个形状对象,并调用其 Draw() 方法。由于 Draw() 是一个虚拟函数,因此将调用与实际对象类型对应的实现。

现在,让我们创建一些形状对象并使用 DrawShape()

🎜Liaison dynamique🎜🎜🎜La liaison dynamique est le processus de résolution des types et d'appel des fonctions correspondantes au moment de l'exécution. Cela se produit lorsque le compilateur ne sait pas quelle implémentation de fonction sera appelée au moment de la compilation. La liaison dynamique permet de modifier le type d'un objet pendant l'exécution du programme, permettant une plus grande flexibilité. 🎜🎜🎜Cas pratique I : Hiérarchie des classes d'animaux 🎜🎜🎜Considérez la hiérarchie de classes d'animaux suivante : 🎜
int main() {
    Rectangle rectangle;
    Circle circle;

    DrawShape(rectangle);  // 输出:"Rectangle drawn"
    DrawShape(circle);    // 输出:"Circle drawn"

    return 0;
}
🎜Chaque classe déclare une fonction virtuelle Speak() qui peut être remplacée dans les classes dérivées. 🎜rrreee🎜🎜Cas pratique II : Dessin graphique🎜🎜🎜La liaison dynamique peut également être utilisée pour implémenter le dessin dynamique d'objets dans des applications graphiques. Prenons l'exemple suivant : 🎜rrreee🎜Dans cet exemple, la fonction DrawShape() reçoit un objet de forme via une référence de classe de base et appelle sa méthode Draw(). Puisque Draw() est une fonction virtuelle, l'implémentation correspondant au type d'objet réel est appelée. 🎜🎜Maintenant, créons quelques objets de forme et dessinons-les à l'aide de la fonction DrawShape() : 🎜rrreee

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