Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Ralat "Panggilan Fungsi Maya Tulen" Berlaku dalam Pembina dan Pemusnah?

Mengapa Ralat "Panggilan Fungsi Maya Tulen" Berlaku dalam Pembina dan Pemusnah?

DDD
DDDasal
2024-11-12 12:16:01597semak imbas

Why Do

Menyingkap Enigma Ranap "Panggilan Fungsi Maya Tulen"

Dalam bidang pengaturcaraan, menghadapi ranap 伴随着 "panggilan fungsi maya tulen " ralat boleh membingungkan, menyebabkan pembangun menggaru kepala mereka. Artikel ini bertujuan untuk menjelaskan punca di sebalik ralat yang sukar difahami ini.

Sifat Abstrak Fungsi Maya Tulen

Fungsi maya tulen adalah aspek asas objek- pengaturcaraan berorientasikan, membolehkan pengisytiharan fungsi dalam kelas abstrak yang mesti dilaksanakan dalam kelas terbitan. Dengan reka bentuk, fungsi maya tulen tidak mempunyai pelaksanaan dalam kelas abstrak.

The Culprit: Constructor and Destructor Calls

Namun, masalah timbul apabila panggilan fungsi maya dicuba dari dalam pembina atau pemusnah. Dalam kes sedemikian, had yang wujud akan dimainkan: panggilan fungsi maya semasa pemulaan objek atau pemusnahan tidak dibenarkan. Sebab di sebalik sekatan ini terletak pada keadaan tidak lengkap objek kelas terbitan semasa fasa kewujudannya.

Seruan Kelas Asas

Sebagai akibat daripada larangan ini, panggilan fungsi maya daripada pembina atau pemusnah menghasilkan pemanggilan versi kelas asas bagi fungsi tersebut. Ini menimbulkan masalah jika fungsi maya tulen tidak mempunyai pelaksanaan kelas asas, yang selalunya berlaku dalam kelas abstrak.

Contoh Ilustrasi

Untuk menggambarkan isu ini, pertimbangkan kod C berikut:

class Base {
public:
    Base() { reallyDoIt(); }
    void reallyDoIt() { doIt(); } // DON'T DO THIS
    virtual void doIt() = 0;
};

class Derived : public Base {
    void doIt() {}
};

int main() {
    Derived d; // Triggers "pure virtual function call" error
}

Dalam contoh ini, fungsi reallyDoIt() dalam kelas Base memanggil doIt() fungsi. Walau bagaimanapun, kerana doIt() ialah fungsi maya tulen, kelas asas tidak mempunyai pelaksanaan untuknya. Akibatnya, apabila objek kelas Terhasil dicipta, ia cuba memanggil fungsi doIt() daripada pembina, membawa kepada ralat "panggilan fungsi maya tulen" yang ditakuti.

Sumber Tambahan

Untuk menyelami topik ini dengan lebih mendalam, sila rujuk artikel bernas oleh Raymond Chen di subjek:

  • [Blog Raymond Chen: "Fungsi Maya Tulen dan Vptr" (Bahagian 1)](https://devblogs.microsoft.com/oldnewthing/2007/12/18/pure- virtual-functions-and-the-vptr/)
  • [Blog Raymond Chen: "Tulen Fungsi Maya dan Vptr" (Bahagian 2)](https://devblogs.microsoft.com/oldnewthing/2007/12/20/pure-virtual-functions-and-the-vptr-part-deux/)

Atas ialah kandungan terperinci Mengapa Ralat "Panggilan Fungsi Maya Tulen" Berlaku dalam Pembina dan Pemusnah?. 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