Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memanggil Fungsi Maya Kelas Asas daripada Kelas Terbitan dalam C?

Bagaimanakah Saya Boleh Memanggil Fungsi Maya Kelas Asas daripada Kelas Terbitan dalam C?

Barbara Streisand
Barbara Streisandasal
2024-12-13 02:28:09902semak imbas

How Can I Call a Base Class's Virtual Function from a Derived Class in C  ?

Memanggil Fungsi Maya Kelas Asas Walaupun Ditindih dalam C

Dalam pengaturcaraan berorientasikan objek, adalah perkara biasa bagi kelas terbitan untuk mengatasi fungsi maya daripada kelas asas mereka. Walau bagaimanapun, situasi mungkin timbul apabila kelas terbitan memerlukan akses kepada fungsi ganti.

Pertimbangkan kod C berikut:

class Foo {
public:
    int x;

    virtual void printStuff() {
        std::cout << x << std::endl;
    }
};

class Bar : public Foo {
public:
    int y;

    void printStuff() {
        // I would like to call Foo.printStuff() here...
        std::cout << y << std::endl;
    }
};

Dalam contoh di atas, kelas Bar mengatasi fungsi printStuff, tetapi ia juga mungkin perlu mengakses versi kelas asas.

Java's super vs. C Sintaks

Di Java, sintaks super.funcname() membenarkan kelas terbitan untuk memanggil kaedah kelas asas. Walau bagaimanapun, C memerlukan pendekatan yang berbeza. Untuk memanggil fungsi kelas asas yang diganti, gunakan sintaks berikut:

class Bar : public Foo {
  // ...

  void printStuff() override {  // help the compiler to check
    Foo::printStuff(); // calls base class' function
  }
};

Dalam sintaks ini:

  • tindih adalah pilihan tetapi disyorkan untuk membantu pengkompil memastikan penggantian yang betul.
  • Foo::printStuff() secara eksplisit memanggil kelas asas fungsi.

Penamaan eksplisit ini diperlukan kerana C membenarkan pewarisan berbilang, tidak seperti Java. Akibatnya, pengkompil perlu mengetahui kaedah kelas asas yang hendak dipanggil apabila ditindih.

Contoh Penggunaan

Kembali kepada kod asal, pengubahsuaian berikut membenarkan Bar: :printStuff() untuk mengakses kedua-dua ahli datanya sendiri y dan ahli data kelas asas x:

void printStuff() override {
    Foo::printStuff();
    std::cout << y << std::endl;
}

Ini bertambah baik versi printStuff mengeluarkan nilai x kelas asas, diikuti dengan nilai y kelas terbitan, menyediakan kefungsian yang diingini.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanggil Fungsi Maya Kelas Asas daripada Kelas Terbitan dalam C?. 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