Maison  >  Article  >  développement back-end  >  Quel rôle jouent les fonctions virtuelles dans le polymorphisme en C++ ?

Quel rôle jouent les fonctions virtuelles dans le polymorphisme en C++ ?

王林
王林original
2024-06-05 20:55:001100parcourir

En obtenant le polymorphisme grâce à la liaison dynamique, les fonctions virtuelles permettent aux objets de classe dérivée d'appeler leur propre version de fonctions virtuelles, même si la fonction est déclarée par la classe de base. Plus précisément : les fonctions virtuelles sont déclarées dans la classe de base et utilisent le mot-clé virtual. Le compilateur utilise une table de pointeur virtuel pour rechercher dynamiquement l'implémentation de la fonction pour le type d'objet d'exécution. Un objet de classe dérivée appelle toujours sa propre version d'une fonction virtuelle, même si elle est déclarée par une classe de base.

C++ 中虚函数在多态性中扮演什么角色?

Le rôle des fonctions virtuelles dans le polymorphisme C++

En programmation orientée objet (POO), le polymorphisme est une fonctionnalité qui permet à un objet de répondre au même appel de méthode de différentes manières. En C++, les fonctions virtuelles réalisent le polymorphisme grâce à une liaison dynamique.

Qu'est-ce qu'une fonction virtuelle ?

Les fonctions virtuelles sont des fonctions membres déclarées dans la classe de base et remplacées par la classe dérivée. Lors de la déclaration de fonctions virtuelles dans une classe de base, utilisez le préfixe de mot-clé virtual. virtual 关键字前缀。

虚函数的工作原理

当调用虚函数时,编译器不会查找基类中的函数实现。相反,它会查找运行时对象类型的函数实现。这意味着子类对象始终调用其自身版本的虚函数,即使该函数是由基类声明的。

虚指针表

虚函数调用涉及称为虚指针表的特殊数据结构。对于每个具有虚函数的类,编译器都会创建一个虚指针表,其中包含指向该类虚函数的指针。当创建派生类对象时,该对象包含指向其自身虚指针表的指针。

实战案例

考虑以下示例:

class Shape {
public:
    virtual void draw() const = 0;
    // 其他函数和变量
};

class Rectangle : public Shape {
public:
    void draw() const override {
        // 绘制一个矩形
    }
};

class Circle : public Shape {
public:
    void draw() const override {
        // 绘制一个圆
    }
};

int main() {
    Shape* shapes[] = {new Rectangle(), new Circle()};
    for (Shape* shape : shapes) {
        shape->draw(); // 根据运行时类型调用正确的 draw() 方法
        delete shape;
    }
}

在这个示例中,Shape 类声明了一个虚函数 draw()。派生类 RectangleCircle 重写了 draw() 方法以提供针对特定形状的自定义实现。在 main() 函数中,我们创建了一个形状数组并对每个形状调用 draw() 方法。尽管所有形状都声明为基类类型,但它们会根据实际运行时类型调用正确的 draw()

🎜Comment fonctionnent les fonctions virtuelles🎜🎜🎜Lorsqu'une fonction virtuelle est appelée, le compilateur ne recherche pas l'implémentation de la fonction dans la classe de base. Au lieu de cela, il recherche l’implémentation de la fonction pour le type d’objet d’exécution. Cela signifie qu'un objet de sous-classe appelle toujours sa propre version d'une fonction virtuelle, même si la fonction est déclarée par la classe de base. 🎜🎜🎜Table de pointeurs virtuels🎜🎜🎜Les appels de fonctions virtuelles impliquent une structure de données spéciale appelée table de pointeurs virtuels. Pour chaque classe dotée de fonctions virtuelles, le compilateur crée une table de pointeurs virtuels contenant des pointeurs vers les fonctions virtuelles de la classe. Lorsqu'un objet de classe dérivée est créé, l'objet contient un pointeur vers sa propre table de pointeurs virtuels. 🎜🎜🎜Cas pratique🎜🎜🎜Considérons l'exemple suivant : 🎜rrreee🎜Dans cet exemple, la classe Shape déclare une fonction virtuelle draw(). Les classes dérivées Rectangle et Circle remplacent la méthode draw() pour fournir des implémentations personnalisées pour des formes spécifiques. Dans la fonction main(), nous créons un tableau de formes et appelons la méthode draw() pour chaque forme. Bien que toutes les formes soient déclarées comme types de classe de base, elles appellent la méthode draw() correcte en fonction du type d'exécution réel, démontrant la puissance des fonctions virtuelles pour réaliser le polymorphisme en C++. 🎜

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