Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah model objek C berfungsi, termasuk fungsi maya dan warisan?
Model objek C adalah berdasarkan gabungan mekanisme kompilasi masa dan runtime untuk menyokong ciri-ciri seperti warisan, polimorfisme, dan enkapsulasi. Pada terasnya, ia bergantung kepada konsep kelas sebagai pelan tindakan untuk membuat objek. Setiap objek adalah contoh kelas, yang mengandungi kedua -dua data (pembolehubah ahli) dan kod (fungsi ahli).
Warisan: Warisan membolehkan membuat kelas baru (kelas yang diperolehi) berdasarkan yang sedia ada (kelas asas). Kelas yang diperoleh mewarisi ahli (data dan fungsi) kelas asas mereka, dan boleh menambah ahli mereka sendiri atau menimpa yang ada. Ini menggalakkan penggunaan semula kod dan mewujudkan hubungan "is-a". Sebagai contoh, kelas Dog
mungkin mewarisi dari kelas Animal
.
Fungsi Maya: Fungsi maya adalah fungsi ahli yang diisytiharkan dengan kata kunci virtual
di kelas asas. Mereka membolehkan polimorfisme runtime, yang bermaksud fungsi yang betul untuk dipanggil ditentukan semasa runtime berdasarkan jenis sebenar objek, bukan jenis yang diisytiharkan. Ini penting untuk mencapai fleksibiliti dan kelanjutan. Mekanisme di sebalik ini adalah jadual fungsi maya (vtable) . Setiap kelas dengan fungsi maya mempunyai vtable sendiri, yang merupakan jadual penunjuk kepada fungsi maya yang dilaksanakan di kelas itu. Setiap objek kelas yang mengandungi fungsi maya mempunyai penunjuk tersembunyi (sering dipanggil VPTR) yang menunjuk kepada vtable kelasnya. Apabila fungsi maya dipanggil, runtime menggunakan VPTR untuk mencari fungsi yang betul dalam vtable.
Contoh:
<code class="c ">class Animal { public: virtual void makeSound() { std::cout makeSound(); // Calls Dog::makeSound() due to virtual function delete animal; return 0; }</code>
Dalam contoh ini, makeSound
adalah fungsi maya. Walaupun animal
diisytiharkan sebagai penunjuk Animal
, fungsi makeSound
yang betul (dari kelas Dog
) dipanggil semasa runtime kerana mekanisme vtable.
Menggunakan fungsi maya memperkenalkan overhead prestasi berbanding fungsi bukan maya. Overhead ini berpunca dari beberapa faktor:
Walau bagaimanapun, overhed ini pada umumnya kecil dan sering diabaikan, terutamanya berbanding dengan manfaat polimorfisme dan pemeliharaan kod yang disediakan oleh fungsi maya. Penyusun moden menggunakan pelbagai teknik pengoptimuman untuk meminimumkan kesan prestasi fungsi maya, seperti inlining dan fungsi penunjuk. Kesan prestasi hanya penting apabila fungsi maya dipanggil dalam bahagian prestasi kritikal kod, dan walaupun itu, perbezaannya sering kecil kecuali fungsi itu dipanggil bilangan kali yang sangat besar.
C warisan mempengaruhi pengurusan ingatan dan saiz objek dalam beberapa cara:
unique_ptr
, shared_ptr
) dapat memudahkan pengurusan memori dalam senario tersebut.Pengiriman statik dan penghantaran dinamik adalah dua cara yang berbeza untuk menentukan fungsi yang hendak dipanggil semasa runtime. Perbezaan utama terletak pada ketika keputusan dibuat:
Contoh yang menggambarkan perbezaannya:
<code class="c ">class Animal { public: void makeSound() { std::cout makeSound(); // Static dispatch: Calls Animal::makeSound() animal->move(); // Dynamic dispatch: Calls Dog::move() delete animal; return 0; }</code>
Dalam contoh ini, makeSound
menggunakan penghantaran statik kerana ia bukan maya, sementara move
menggunakan penghantaran dinamik kerana ia adalah maya. Ini menunjukkan bagaimana kehadiran (atau ketiadaan) kata kunci virtual
menentukan mekanisme penghantaran.
Atas ialah kandungan terperinci Bagaimanakah model objek C berfungsi, termasuk fungsi maya dan warisan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!