Rumah >pembangunan bahagian belakang >C++ >Penjelasan terperinci tentang warisan fungsi C++: Apakah itu upcasting dan downcasting?
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.
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 = □ // 通过形状对象调用 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
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!