Memahami Fungsi Maya dan Tulen Maya
Fungsi maya memainkan peranan penting dalam pengaturcaraan berorientasikan objek dengan mendayakan polimorfisme masa jalan. Seperti yang ditakrifkan oleh Wikipedia, fungsi maya ialah kaedah atau fungsi boleh ganti yang membenarkan penghantaran dinamik. Ini bermakna fungsi khusus yang akan dilaksanakan ditentukan berdasarkan jenis objek pada masa jalan, dan bukannya pada masa penyusunan.
Berbeza dengan fungsi bukan maya, apabila fungsi maya ditindih dalam kelas terbitan , versi yang ditakrifkan dalam kelas paling banyak terbitan digunakan di seluruh hierarki kelas. Ini memastikan bahawa pelaksanaan fungsi yang paling khusus sentiasa digunakan.
Fungsi maya tulen, juga dikenali sebagai kaedah maya tulen, bawa konsep ini lebih jauh. Ia adalah fungsi maya yang mesti dilaksanakan dalam kelas terbitan jika kelas itu bukan abstrak. Oleh itu, fungsi maya tulen secara berkesan mewajibkan kehadiran gelagat tertentu dalam kelas terbitan.
Kelas abstrak ialah kelas yang mengandungi satu atau lebih fungsi maya tulen. Kelas sedemikian tidak boleh digunakan secara langsung; sebaliknya, kelas terbitan yang menyediakan pelaksanaan untuk semua fungsi maya tulen mesti digunakan.
Untuk menggambarkan perbezaan antara fungsi maya maya dan tulen, pertimbangkan C berikut kod:
Base.hpp:
struct Base { virtual ~Base() = default; virtual void foo() { std::cout << "Base::Foo" << std::endl; } };
Derived.hpp:
struct Derived : public Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
utama .cpp:
int main() { Base base; base.foo(); // Calls Base::Foo Derived derived; derived.foo(); // Calls Derived::Foo Base* derived_as_base = &derived; derived_as_base->foo(); // Calls Derived::Foo (due to dynamic dispatch) }
Dalam kod ini, kelas Base mengandungi fungsi maya foo yang mencetak "Base::Foo." Kelas Derived mengatasi fungsi ini untuk mencetak "Derived::Foo." Apabila objek Base memanggil foo, outputnya ialah "Base::Foo." Walau bagaimanapun, apabila objek Terbitan (diakses sebagai penuding Pangkalan) memanggil foo, output ialah "Derived::Foo" disebabkan oleh penghantaran dinamik.
Sekarang, mari kita pertimbangkan maya tulen fungsi:
PureBase.hpp:
struct PureBase { virtual ~PureBase() = default; virtual void foo() = 0; // Pure virtual function };
PureDerived.hpp:
struct PureDerived : public PureBase { void foo() override { std::cout << "PureDerived::Foo" << std::endl; } };
Dalam kod ini, kelas PureBase mengandungi foo fungsi maya tulen yang tidak ditakrifkan dalam kelas asas. Akibatnya, kelas PureBase adalah abstrak kerana ia tidak mempunyai pelaksanaan yang lengkap.
PureMain.cpp:
int main() { // error: cannot declare variable 'pureBase' to be of abstract type 'PureBase' // PureBase pureBase; // pureBase.foo(); PureDerived pureDerived; pureDerived.foo(); // Calls PureDerived::Foo }
Dalam contoh ini, cuba membuat instantiate PureBase objek secara langsung mengakibatkan ralat pengkompil. Walau bagaimanapun, mencipta objek PureDerived dibenarkan kerana ia menyediakan pelaksanaan untuk fungsi foo.
Untuk meringkaskan, fungsi maya menyediakan penghantaran dinamik dan boleh ditindih dalam kelas terbitan. Fungsi maya tulen, sebaliknya, diperlukan untuk dilaksanakan dalam kelas terbitan dan menguatkuasakan tingkah laku tertentu. Bersama-sama, konsep ini memainkan peranan penting dalam mendayakan kefungsian polimorfik dalam pengaturcaraan berorientasikan objek.
Atas ialah kandungan terperinci Apakah Perbezaan Antara Fungsi Maya Maya dan Tulen dalam Pengaturcaraan Berorientasikan Objek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!