Heim >Backend-Entwicklung >C++ >Detaillierte Erläuterung der C++-Funktionsvererbung: Was sind Upcasting und Downcasting?

Detaillierte Erläuterung der C++-Funktionsvererbung: Was sind Upcasting und Downcasting?

PHPz
PHPzOriginal
2024-04-30 13:24:011182Durchsuche

Bei der Vererbung wandelt die Aufwärtstransformation die abgeleitete Klasse in die Basisklasse um, und die Abwärtstransformation wandelt die Basisklasse in die abgeleitete Klasse um. Upcasting ist sicher, Informationen können verloren gehen. Downcasting ist gefährlich. Sie müssen sicherstellen, dass die entsprechende abgeleitete Klasse vorhanden ist, andernfalls wird nullptr zurückgegeben.

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

Upcasting und Downcasting in der C++-Funktionsvererbung

In der objektorientierten Programmierung ist Vererbung das Schlüsselkonzept der Klassenhierarchie. Wenn eine Klasse eine andere Klasse (Basisklasse) erbt, erbt die erbende Klasse (abgeleitete Klasse) die Eigenschaften und Methoden der Basisklasse.

Upcast

Upcasting bezieht sich auf die Konvertierung eines abgeleiteten Klassenobjekts in eine Referenz oder einen Zeiger auf ein Basisklassenobjekt. Diese Typkonvertierung ist sicher, da das abgeleitete Klassenobjekt alle Daten und Methoden des Basisklassenobjekts enthält. Sie kann jedoch zu einem Informationsverlust führen, da auf die eindeutigen Methoden und Daten der abgeleiteten Klasse nach der Konvertierung nicht zugegriffen werden kann.

Syntax:

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

Downcasting

Downcasting bezieht sich auf die Konvertierung eines Basisklassenobjekts in eine Referenz oder einen Zeiger auf ein abgeleitetes Klassenobjekt. Diese Typkonvertierung ist gefährlich, da sie zu ungültigen Umwandlungen führen kann. Downcasting funktioniert nur, wenn das abgeleitete Klassenobjekt tatsächlich im Basisklassenobjekt vorhanden ist.

Syntax:

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

Der dynamic_cast-Operator führt eine Laufzeittypprüfung durch, um sicherzustellen, dass die Umwandlung sicher ist. Wenn die Umwandlung ungültig ist, gibt dynamic_cast nullptr zurück. 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()

🎜Praktischer Fall🎜🎜🎜Angenommen, wir haben eine Shape-Klasse als Basisklasse, die über eine getArea()-Methode zur Berechnung der Fläche einer Form verfügt. Die abgeleitete Klasse Square erbt die Klasse Shape und fügt eine Methode getWidth() hinzu, um die Breite des Quadrats zu ermitteln. 🎜🎜🎜Shape.h🎜🎜rrreee🎜🎜Square.h🎜🎜rrreee🎜🎜main.cpp🎜🎜rrreee🎜In diesem Beispiel erstellen wir ein quadratisches Objekt, wandeln es in ein Formobjekt um und rufen getArea( )-Methode. Dann wandeln wir das Formobjekt in ein quadratisches Objekt um und rufen die Methode getWidth() auf. 🎜

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der C++-Funktionsvererbung: Was sind Upcasting und Downcasting?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn