Maison >développement back-end >C++ >Explication détaillée de l'héritage des fonctions C++ : que sont l'upcasting et le downcasting ?
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é.
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 = □ // 通过形状对象调用 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()
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!