Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: ahli maya tidak boleh menjadi ahli data statik atau bukan statik Apa yang perlu saya lakukan?

Ralat sintaks C++: ahli maya tidak boleh menjadi ahli data statik atau bukan statik Apa yang perlu saya lakukan?

PHPz
PHPzasal
2023-08-22 09:52:44966semak imbas

Dalam C++, apabila kita menggunakan kata kunci maya untuk mentakrifkan ahli fungsi, ia bermakna fungsi itu adalah fungsi maya dan boleh ditindih oleh subkelas. Walau bagaimanapun, jika kita mentakrifkan ahli data (iaitu atribut) sebagai maya, pengkompil C++ akan melaporkan ralat: ahli maya tidak boleh menjadi ahli data statik atau bukan statik.

Jadi mengapa maya tidak boleh digunakan untuk ahli data? Kerana perbezaan antara fungsi maya dan fungsi bukan maya ialah fungsi maya diakses melalui jadual fungsi, manakala ahli data diakses secara langsung. Jika kita mentakrifkan ahli data sebagai maya, program akan ralat kerana ia tidak dapat mencari fungsi maya.

Jadi bagaimana jika anda benar-benar perlu mengatasi pembolehubah ahli dalam subkelas? Anda boleh menggunakan ciri baharu yang diperkenalkan dalam C++11 - warisan maya. Warisan maya ialah kaedah pewarisan khas yang boleh mengurangkan kerumitan warisan berbilang dan menyelesaikan beberapa masalah. Dalam pewarisan maya, pembina kelas asas hanya akan dipanggil sekali, dengan itu mengelakkan masalah yang disebabkan oleh berbilang permulaan.

Berikut ialah kod sampel yang menggunakan warisan maya untuk melaksanakan pembolehubah ahli mengatasi:

class Base {
public:
    virtual int& getVar() { return var; }

protected:
    int var;
};

class Derived : virtual public Base {
public:
    virtual int& getVar() { return var; }

protected:
    int var;
};

int main() {
    Base* b = new Derived();
    b->getVar() = 42;
    cout << b->getVar() << endl;

    return 0;
}

Dalam kod sampel ini, kami mentakrifkan Base kelas asas dan kelas terbitan Terbitan. Terdapat pembolehubah integer dalam kelas Base Kami mentakrifkannya sebagai jenis maya Walaupun pembolehubah ini tidak boleh diakses dengan cara ini, fungsi ini boleh digunakan sebagai kelas asas untuk menulis semula oleh kelas terbitan. Kelas Derived juga mempunyai pembolehubah integer bernama var, dan ia mengatasi fungsi getVar() dalam Base, meliputi fungsi dalam Base. Dalam fungsi utama, kami mencipta contoh Terbitan, tunjuk kepadanya dengan penunjuk kelas asas b, dan aksesnya melalui fungsi getVar(). Keluaran ialah 42.

Menggunakan warisan maya, kita boleh mengatasi pembolehubah ahli bernama var dalam kelas asas dalam kelas terbitan, dan boleh mengakses nilai pembolehubah ini, mencapai operasi yang serupa dengan mengatasi fungsi.

Ringkasnya, kata kunci maya dalam C++ hanya boleh digunakan untuk fungsi, bukan ahli data. Jika anda ingin mengatasi pembolehubah ahli dalam subkelas, anda boleh menggunakan warisan maya. Warisan maya boleh mengelakkan masalah pemulaan berbilang dan boleh mengakses pembolehubah ahli yang diganti dalam kelas asas.

Atas ialah kandungan terperinci Ralat sintaks C++: ahli maya tidak boleh menjadi ahli data statik atau bukan statik Apa yang perlu saya lakukan?. 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