Maison  >  Article  >  développement back-end  >  Quel est le mécanisme d’implémentation de l’héritage et du polymorphisme en C++ ?

Quel est le mécanisme d’implémentation de l’héritage et du polymorphisme en C++ ?

WBOY
WBOYoriginal
2024-06-01 20:52:00667parcourir

Le mécanisme d'implémentation de l'héritage et du polymorphisme en C++ : Héritage : implémentées via des spécificateurs d'héritage, les classes dérivées héritent et étendent le comportement de la classe de base. Polymorphisme : réalisé via une table de fonctions virtuelles, le pointeur de classe de base appelle dynamiquement la méthode de classe dérivée. Exemple d'implémentation : grâce à l'héritage et au polymorphisme, vous pouvez créer une hiérarchie de classes de formes et écrire des fonctions pour calculer la surface totale de n'importe quelle forme.

C++ 中继承和多态性的实现机制是什么?

Le mécanisme d'implémentation de l'héritage et du polymorphisme en C++

L'héritage et le polymorphisme sont des fonctionnalités cruciales en C++ pour réaliser la réutilisation du code et la liaison dynamique. Cependant, comprendre son implémentation sous-jacente est important pour écrire un code efficace et robuste.

Mécanisme d'implémentation

1. L'héritage

L'héritage est un moyen de créer une nouvelle classe (classe dérivée) qui hérite et étend le comportement d'une classe existante (classe de base). En C++, l'héritage est implémenté via les spécificateurs d'héritage public, protected ou private. publicprotectedprivate 继承说明符实现。

例如:

class Animal {
public:
    virtual void speak() { cout << "Animal sound" << endl; }
};

class Dog : public Animal {
public:
    void speak() override { cout << "Woof!" << endl; }
};

在这个示例中,Dog 类继承了 Animal 基类的 speak() 方法,并覆盖了该方法以提供特定的行为。

2. 多态性

多态性是指在运行时根据对象的实际类型动态调用方法的能力。它使基类指针能够访问派生类对象中的方法。

C++ 中的多态性是通过虚函数表实现的。在编译期间,为每个虚函数生成一个虚函数表条目。当基类指针调用虚函数时,它将查找对象的虚函数表,然后调用相应的方法。

例如:

Animal* animal = new Dog();
animal->speak(); // 输出: "Woof!"

尽管 animal 指向的是 Animal 基类,但由于多态性,它将调用 Dog 对象中的 speak() 方法。

实战案例

考虑一个形状类层次结构,包括 Shape 基类和 CircleSquareTriangle 派生类。

class Shape {
public:
    virtual double area() = 0;
};

class Circle : public Shape {
public:
    double area() override { return 3.14 * radius * radius; }
};

class Square : public Shape {
public:
    double area() override { return side * side; }
};

class Triangle: public Shape {
public:
    double area() override { return 0.5 * base * height; }
};

通过使用继承和多态性,我们可以编写一个 calculateTotalArea()

Par exemple : 🎜
double calculateTotalArea(vector<Shape*>& shapes) {
    double totalArea = 0;
    for (Shape* shape : shapes) {
        totalArea += shape->area();
    }
    return totalArea;
}
🎜Dans cet exemple, la classe Dog hérite de la méthode speak() de la classe de base Animal et remplace la Méthode pour fournir un comportement spécifique. 🎜🎜🎜2. Polymorphisme 🎜🎜🎜Le polymorphisme fait référence à la capacité d'appeler dynamiquement des méthodes au moment de l'exécution en fonction du type réel de l'objet. Il permet aux pointeurs de classe de base d'accéder aux méthodes des objets de classe dérivés. 🎜🎜Le polymorphisme en C++ est obtenu grâce à des tables de fonctions virtuelles. Lors de la compilation, une entrée vtable est générée pour chaque fonction virtuelle. Lorsqu'un pointeur de classe de base appelle une fonction virtuelle, il recherche la table virtuelle de l'objet, puis appelle la méthode appropriée. 🎜🎜Par exemple : 🎜rrreee🎜Bien que animal pointe vers la classe de base Animal, en raison du polymorphisme, il appellera l'objet Dog speak() méthode. 🎜🎜🎜Cas pratique🎜🎜🎜Considérons une hiérarchie de classes de formes, comprenant la classe de base Shape et Circle, Square et Triangle Classe dérivée. 🎜rrreee🎜En utilisant l'héritage et le polymorphisme, nous pouvons écrire une fonction <code>calculateTotalArea() qui peut calculer l'aire totale de n'importe quelle forme : 🎜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