首頁 >後端開發 >C++ >C++ 函數繼承詳解:什麼是向上轉型和向下轉型?

C++ 函數繼承詳解:什麼是向上轉型和向下轉型?

PHPz
PHPz原創
2024-04-30 13:24:011182瀏覽

繼承中,向轉型將衍生類別轉換為基底類,向下轉型將基底類別轉換為衍生類別。向上轉型安全,資訊可能遺失;向下轉型危險,須確保存在對應派生類,否則返回 nullptr。

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

C 函數繼承中的向轉型和向下轉型

在物件導向程式設計中,繼承是類別層次結構的關鍵概念。當一個類別繼承了另一個類別(基底類別)時,繼承類別(衍生類別)將繼承基底類別的屬性和方法。

向上轉型

向上轉型是指將衍生類別物件轉換為基底類別物件的參考或指標。這種類型轉換是安全的,因為派生類別物件包含所有基底類別物件的資料和方法,但它可能導致資訊的遺失,因為派生類別的特有方法和資料在轉換後將無法存取。

語法:

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

向下轉型

#向下轉型是指將基底類別物件轉換為衍生類別對象的引用或指標。這種類型轉換是危險的,因為它可能導致無效的強制類型轉換。只有當派生類別物件確實存在於基底類別物件中時,向下轉型才有效。

語法:

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

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() 方法。

以上是C++ 函數繼承詳解:什麼是向上轉型和向下轉型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn