Rumah >pembangunan bahagian belakang >C++ >Penjelasan terperinci tentang warisan fungsi C++: Apakah itu upcasting dan downcasting?

Penjelasan terperinci tentang warisan fungsi C++: Apakah itu upcasting dan downcasting?

PHPz
PHPzasal
2024-04-30 13:24:011182semak imbas

Dalam pewarisan, transformasi ke atas menukar kelas terbitan kepada kelas asas, dan transformasi ke bawah menukar kelas asas kepada kelas terbitan. Upcasting adalah selamat, maklumat mungkin hilang; downcasting adalah berbahaya, anda mesti memastikan bahawa kelas terbitan yang sepadan wujud, jika tidak nullptr akan dikembalikan.

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

Upcasting dan Downcasting dalam C++ Function Inheritance

Dalam pengaturcaraan berorientasikan objek, warisan ialah konsep utama hierarki kelas. Apabila kelas mewarisi kelas lain (kelas asas), kelas pewarisan (kelas terbitan) mewarisi sifat dan kaedah kelas asas.

Upcast

Upcasting merujuk kepada menukar objek kelas terbitan kepada rujukan atau penunjuk kepada objek kelas asas. Penukaran jenis ini selamat kerana objek kelas terbitan mengandungi semua data dan kaedah objek kelas asas, tetapi ia mungkin mengakibatkan kehilangan maklumat kerana kaedah unik dan data kelas terbitan tidak akan dapat diakses selepas penukaran.

Syntax:

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

Downcasting

Downcasting merujuk kepada menukar objek kelas asas kepada rujukan atau penunjuk kepada objek kelas terbitan. Penukaran jenis ini berbahaya kerana ia boleh menyebabkan hantaran tidak sah. Downcasting hanya berfungsi jika objek kelas terbitan sebenarnya wujud dalam objek kelas asas.

Sintaks:

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

Pengendali dynamic_cast akan melakukan semakan jenis masa jalan untuk memastikan pelakon selamat. Jika pelakon tidak sah, dynamic_cast mengembalikan 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()

🎜Kes praktikal🎜🎜🎜 Katakan kita mempunyai kelas Shape sebagai kelas asas, yang mempunyai kaedah getArea() untuk mengira luas sesuatu bentuk. Kelas terbitan Square mewarisi kelas Shape dan menambah kaedah getWidth() untuk mendapatkan lebar segi empat sama. bentuk ) kaedah. Kemudian, kami menurunkan objek bentuk kepada objek segi empat sama dan memanggil kaedah getWidth(). 🎜

Atas ialah kandungan terperinci Penjelasan terperinci tentang warisan fungsi C++: Apakah itu upcasting dan downcasting?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn