Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menggunakan "penunjuk kelas asas" dan "penunjuk kelas terbitan" dalam warisan?

Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menggunakan "penunjuk kelas asas" dan "penunjuk kelas terbitan" dalam warisan?

PHPz
PHPzasal
2024-05-01 22:27:02805semak imbas

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.

C++ 函数继承详解:如何在继承中使用“基类指针”和“派生类指针”?

Penjelasan terperinci tentang warisan fungsi C++: menggunakan "penunjuk kelas asas" dan "penunjuk kelas terbitan"

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.

Penunjuk kelas asas menghala ke objek kelas terbitan

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() 时,它调用基类 Baseprint() 方法,而不是派生类的 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() 时,它调用基类 Baseprint() 方法,因为 d 指向的是 Base 类型的对象。然而,我们无法调用派生类的 derivedMethod(),因为编译器无法保证 d

Penuding kelas terbitan menunjuk ke objek kelas asas

Situasi ini bukan perkara biasa, tetapi mungkin. Ini berlaku apabila penunjuk objek kelas asas diberikan kepada penunjuk kelas terbitan. Pengkompil melakukan operasi yang dipanggil "downcast" untuk menjadikan sifat dan kaedah khusus kelas terbitan tersedia semula.

rrreee

Dalam contoh di atas, kami menggunakan hantaran ke bawah yang tidak selamat untuk menetapkan alamat objek kelas asas Base 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!

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