Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: Fungsi ahli templat kelas tidak boleh menjadi fungsi maya, apakah yang perlu saya lakukan?

Ralat sintaks C++: Fungsi ahli templat kelas tidak boleh menjadi fungsi maya, apakah yang perlu saya lakukan?

王林
王林asal
2023-08-22 10:09:10944semak imbas

C++ ialah bahasa pengaturcaraan yang digunakan secara meluas. Sebagai bahasa pengaturcaraan berorientasikan objek yang ditaip kuat, tujuan umum, ia cekap, stabil dan boleh skala. Dalam proses pengaturcaraan C++, menggunakan kelas dan templat boleh membantu kami melaksanakan logik kod kami dengan cepat dan berkesan. Walau bagaimanapun, beberapa masalah mungkin dihadapi dalam proses sebenar, seperti masalah bahawa fungsi ahli templat kelas tidak boleh menjadi fungsi maya.

Situasi ini biasanya berlaku apabila menggunakan kelas templat Kami mentakrifkan kelas templat dan mentakrifkan beberapa fungsi maya di dalamnya, tetapi pengkompil melaporkan ralat. Ini kerana apabila kita mengisytiharkan dan mentakrifkan kelas, fungsi ahlinya kelihatan kepada pengkompil untuk ditentukan hanya apabila kejadiannya dicipta. Jadual fungsi maya dijana pada masa penyusunan, oleh itu, fungsi maya tidak boleh ditakrifkan sebagai fungsi ahli templat kelas.

Jadi, bagaimana kita harus menangani masalah ini?

Pertama, kita perlu memahami konsep fungsi maya. Fungsi maya ialah fungsi ahli yang diisytiharkan menggunakan kata kunci maya dalam kelas induk Ia boleh terlebih beban dalam subkelas dan boleh mencapai polimorfisme. Dalam C++, fungsi maya dilaksanakan melalui jadual fungsi maya. Oleh itu, fungsi ahli templat kelas tidak boleh menjadi maya kerana apabila templat diwujudkan, pengkompil tidak tahu fungsi mana yang akhirnya akan digunakan oleh kod tersebut.

Terdapat dua penyelesaian untuk masalah ini:

Kaedah 1: Gunakan warisan dan pemisahan templat

Melalui warisan kelas, anda boleh memindahkan fungsi ahli ke kelas asas, dan kemudian menggunakan ahli kelas terbitan apabila membuat instantiat templat Fungsi akan mengatasi pelaksanaan ahli kelas asas. Ini mengelakkan penggunaan fungsi maya dalam kelas templat.

Contohnya:

template<typename T>
class Base {
public:
    void Foo() {static_cast<T*>(this)->Foo();} // 调用派生类的成员
};

class Derived : public Base<Derived> {
public:
    void Foo() {std::cout << "Hello, World!" << std::endl;}
};

Basis kelas asas di sini hanya mempunyai fungsi bukan maya Foo(), dan fungsi Foo() ditulis semula dalam Derived. Apabila menggunakan kelas Base, kami sebenarnya memindahkan rujukan objek ke kelas terbitannya.

Kaedah 2: Menggunakan penunjuk fungsi

Kita boleh menggunakan kelas atau fungsi bukan templat untuk memanggil fungsi maya, dan kemudian menghantar fungsi sebagai parameter kepada fungsi templat.

Contohnya:

class MyClass {
public:
    virtual void Foo() {std::cout << "MyClass::Foo()" << std::endl;}
};

template<typename T>
void Func(void (T::*foo)()) {
    T obj;
    (obj.*foo)();
}

int main() {
    Func(&MyClass::Foo); // 调用 MyClass::Foo()
    return 0;
}

Dalam contoh ini, templat fungsi Func digunakan untuk menyelesaikan masalah bahawa fungsi ahli templat kelas tidak boleh menjadi fungsi maya. Apabila memanggil Func(), kita menghantar penuding fungsi ahli kelas sebagai parameter kepada fungsi Func() dan penuding fungsi ahli ini menghala ke fungsi maya dalam kelas MyClass.

Untuk meringkaskan, dalam C++, fungsi ahli templat kelas tidak boleh menjadi fungsi maya kerana jadual fungsi maya dijana pada masa penyusunan, dan fungsi ahli kelas templat tidak dibuat seketika pada masa penyusunan, jadi pengkompil tidak boleh menjana fungsi maya. jadual fungsi. Untuk menyelesaikan masalah ini, kita boleh menggunakan dua kaedah di atas untuk mengelak daripada menggunakan fungsi ahli templat kelas sebagai fungsi maya untuk melaksanakan logik kod kami.

Atas ialah kandungan terperinci Ralat sintaks C++: Fungsi ahli templat kelas tidak boleh menjadi fungsi maya, apakah 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