Rumah >pembangunan bahagian belakang >C++ >Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menggunakan 'penunjuk kelas asas' dan 'penunjuk kelas terbitan' dalam warisan?
Dalam pewarisan fungsi, gunakan "penunjuk kelas asas" dan "penunjuk kelas terbitan" untuk memahami mekanisme pewarisan: apabila penuding kelas asas menghala ke objek kelas terbitan, transformasi ke atas dilakukan dan hanya ahli kelas asas diakses. Apabila penuding kelas terbitan menghala ke objek kelas asas, hantaran ke bawah dilakukan (tidak selamat) dan mesti digunakan dengan berhati-hati.
Dalam pengaturcaraan berorientasikan objek, pewarisan adalah konsep penting, yang membolehkan kelas terbitan mewarisi sifat dan kaedah kelas asas. Apabila ia berkaitan dengan pewarisan fungsi, "penunjuk kelas asas" dan "penunjuk kelas terbitan" memainkan peranan penting dalam memahami mekanisme pewarisan.
Keadaan ini berlaku apabila penuding objek kelas terbitan diberikan kepada penuding kelas asas. Pengkompil menjalankan operasi yang dipanggil "upcast" di mana sifat khusus dan kaedah kelas terbitan "tersembunyi", hanya meninggalkan ahli kelas asas.
class Base { public: void print() { cout << "Base class" << endl; } }; class Derived : public Base { public: void print() { cout << "Derived class" << endl; } }; int main() { Derived d; Base* b = &d; // 上向转型 b->print(); // 输出: Base class return 0; }
Dalam contoh di atas, kami menetapkan alamat objek kelas Derived
kepada penuding kelas asas b
. Apabila b->print()
dipanggil, ia memanggil kaedah print()
kelas asas Base
, bukan kaedah kaedah kelas terbitan >print()
, kerana b
ialah penunjuk untuk menaip Base
. Derived
对象的地址赋给基类指针 b
。当调用 b->print()
时,它调用基类 Base
的 print()
方法,而不是派生类的 print()
方法,因为 b
是指向 Base
类型的指针。
这种情况并不常见,但也是可能的。当基类对象指针被赋给派生类指针时,就会发生这种情况。编译器执行称为“向下转型”的操作,使派生类的特定属性和方法再次变得可用。
class Base { public: void print() { cout << "Base class" << endl; } }; class Derived : public Base { public: void print() { cout << "Derived class" << endl; } void derivedMethod() { cout << "Derived method" << endl; } }; int main() { Base b; Derived* d = reinterpret_cast<Derived*>(&b); // 下向转型(不安全!) d->print(); // 输出: Base class d->derivedMethod(); // 编译错误:无法访问派生类方法 return 0; }
在上面的示例中,我们使用了一个不安全的向下转型,将基类 Base
对象的地址赋给了派生类指针 d
。当调用 d->print()
时,它调用基类 Base
的 print()
方法,因为 d
指向的是 Base
类型的对象。然而,我们无法调用派生类的 derivedMethod()
,因为编译器无法保证 d
rrreee
Dalam contoh di atas, kami menggunakan hantaran ke bawah yang tidak selamat untuk menetapkan alamat objek kelas asasBase
kepada penuding kelas terbitan d
. Apabila d->print()
dipanggil, ia memanggil kaedah print()
kelas asas Base
kerana d code> menghala ke objek jenis <code>Base
. Walau bagaimanapun, kami tidak boleh memanggil derivedMethod()
kelas terbitan kerana pengkompil tidak dapat menjamin bahawa d
menunjuk ke objek kelas terbitan. Gunakan "downcasting" dengan berhati-hati 🎜🎜Upcasting biasanya selamat kerana kelas asas mengandungi semua ahli awam kelas terbitan. Walau bagaimanapun, downcasting adalah tidak selamat kerana ia bergantung pada pengaturcara untuk memastikan bahawa penunjuk kelas terbitan benar-benar menghala ke objek kelas terbitan. Adalah amat disyorkan untuk menggunakan operator "dynamic_cast" untuk melakukan pemeriksaan keselamatan sebelum menggunakan downcasting. 🎜🎜Apabila memahami pewarisan fungsi, adalah sangat penting untuk memahami "penunjuk kelas asas" dan "penunjuk kelas turunan". Konsep ini membolehkan kita menggunakan warisan dengan cara yang fleksibel sambil meminimumkan ralat. 🎜Atas ialah kandungan terperinci Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menggunakan 'penunjuk kelas asas' dan 'penunjuk kelas terbitan' dalam warisan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!