Maison >développement back-end >C++ >Explication détaillée de l'héritage des fonctions C++ : que sont l'upcasting et le downcasting ?

Explication détaillée de l'héritage des fonctions C++ : que sont l'upcasting et le downcasting ?

PHPz
PHPzoriginal
2024-04-30 13:24:011179parcourir

En héritage, la transformation ascendante convertit la classe dérivée en classe de base et la transformation descendante convertit la classe de base en classe dérivée. La conversion ascendante est sûre, les informations peuvent être perdues ; la conversion descendante est dangereuse, vous devez vous assurer que la classe dérivée correspondante existe, sinon nullptr sera renvoyé.

C++ 函数继承详解:什么是向上转型和向下转型?

Upcasting et Downcasting dans l'héritage de fonctions C++

Dans la programmation orientée objet, l'héritage est le concept clé de la hiérarchie des classes. Lorsqu'une classe hérite d'une autre classe (classe de base), la classe héritière (classe dérivée) hérite des propriétés et méthodes de la classe de base.

Upcast

Upcasting fait référence à la conversion d'un objet de classe dérivé en une référence ou un pointeur vers un objet de classe de base. Cette conversion de type est sûre car l'objet de classe dérivée contient toutes les données et méthodes de l'objet de classe de base, mais elle peut entraîner une perte d'informations car les méthodes et données uniques de la classe dérivée ne seront pas accessibles après la conversion.

Syntaxe :

基类* 指针 = &派生类对象;

Downcasting

Le downcasting fait référence à la conversion d'un objet de classe de base en une référence ou un pointeur vers un objet de classe dérivé. Cette conversion de type est dangereuse car elle peut conduire à des conversions invalides. La conversion descendante ne fonctionne que si l'objet de classe dérivé existe réellement dans l'objet de classe de base.

Syntaxe :

派生类* 指针 = dynamic_cast<派生类*>(基类对象);

L'opérateur dynamic_cast effectuera une vérification du type d'exécution pour garantir que la diffusion est sûre. Si le cast n'est pas valide, dynamic_cast renvoie nullptr. dynamic_cast 操作符将执行运行时类型检查,以确保转换是安全的。如果转换无效,dynamic_cast 将返回 nullptr

实战案例

假设我们有一个 Shape 类作为基类,它有一个 getArea() 方法来计算形状的面积。派生类 Square 继承了 Shape 类,并添加了一个 getWidth() 方法来获取正方形的宽度。

Shape.h

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

Square.h

class Square : public Shape {
public:
    explicit Square(double width);
    double getArea() const override;
    double getWidth() const;
private:
    double width;
};

main.cpp

#include "Shape.h"
#include "Square.h"

int main() {
    // 创建一个正方形对象
    Square square(5.0);

    // 将正方形对象向上转型为形状对象
    Shape* shape = &square;

    // 通过形状对象调用 getArea() 方法
    double area = shape->getArea();
    std::cout << "正方形的面积: " << area << std::endl;

    // 将形状对象向下转型为正方形对象
    Square* square2 = dynamic_cast<Square*>(shape);

    // 如果向下转型成功,则调用 getWidth() 方法
    if (square2) {
        double width = square2->getWidth();
        std::cout << "正方形的宽度: " << width << std::endl;
    } else {
        std::cout << "向下转型失败" << std::endl;
    }

    return 0;
}

在这个例子中,我们创建了一个正方形对象,将其向上转型为形状对象,并调用了 getArea() 方法。然后,我们向下转型形状对象为正方形对象,并调用 getWidth()

🎜Cas pratique🎜🎜🎜Supposons que nous ayons une classe Shape comme classe de base, qui a une méthode getArea() pour calculer l'aire d'une forme. La classe dérivée Square hérite de la classe Shape et ajoute une méthode getWidth() pour obtenir la largeur du carré. 🎜🎜🎜Shape.h🎜🎜rrreee🎜🎜Square.h🎜🎜rrreee🎜🎜main.cpp🎜🎜rrreee🎜Dans cet exemple, nous créons un objet carré, le convertissons en un objet de forme et appelons getArea( ). Ensuite, nous transformons l'objet forme en objet carré et appelons la méthode getWidth(). 🎜

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