繼承中,向轉型將衍生類別轉換為基底類,向下轉型將基底類別轉換為衍生類別。向上轉型安全,資訊可能遺失;向下轉型危險,須確保存在對應派生類,否則返回 nullptr。
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 = □ // 通过形状对象调用 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中文網其他相關文章!