Video: Writing 2D Games in C using SDL by Thomas Lively 2024
Dalam C ++, hanya kerana anda berfikir bahawa panggilan fungsi tertentu terikat terlambat tidak bermakna ia. Sekiranya tidak diisytiharkan dengan hujah-hujah yang sama dalam subclass, fungsi anggota tidak diganti secara polimorfik, sama ada ia dinyatakan maya atau tidak.
Satu pengecualian kepada peraturan perisytiharan yang sama adalah bahawa jika fungsi anggota dalam kelas asas mengembalikan penunjuk atau rujukan kepada objek kelas asas, fungsi anggota yang ditindas dalam subclass boleh mengembalikan penunjuk atau rujukan kepada objek subclass. Dengan kata lain, fungsi membuat RAOPy () adalah polimorfik, walaupun jenis pemulangan kedua-dua fungsi berbeza:
class Base {public: // return a copy of the current object Base * makeACopy ();}; kelas SubClass: public base {public: // return a copy of subClass object * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. buat salinan(); // lanjutkan …}
Dalam praktiknya, ini agak semula jadi. Fungsi makeACopy () harus mengembalikan objek SubClass jenis , walaupun ia mungkin menimpa BaseClass:: makeACopy () .
Perniagaan ini secara senyap memutuskan apabila fungsi ditindih dan apabila tidak menjadi punca kesilapan dalam C ++; sehingga standard 2011 memperkenalkan descriptor override yang boleh digunakan oleh programmer untuk menunjukkan niatnya untuk menimpa fungsi kelas asas.
C + + menghasilkan ralat pengkompil jika fungsi diisytihar menimpa tetapi tidak, sebenarnya, menimpa fungsi kelas asas untuk beberapa sebab (seperti argumen tidak sepadan) seperti dalam contoh berikut: >
Potongan ini menjana ralat masa kompilasi kerana kaedah GradStudent:: addCourseGrade (terapung) diisytiharkan override tetapi ia tidak, sebenarnya, mengatasi fungsi kelas asas Pelajar:: addCourseGrade (double) kerana jenis argumen tidak ' t padan.
akhir , walaupun fungsi itu sendiri menimpa beberapa fungsi asas kelas terdahulu, seperti yang ditunjukkan dalam tambahan berikut > PostDoc kelas: kelas GradStudent: Pelajar awam {awam: muktamad void addCourseGrade (double grade);}; kelas PostDoc: public GradStudent {awam: void maya addCourseGrade (double grade);}; Sejak Pelajar:: addCourseGrade () menandakan akhir
,
deklarasi PostDoc:: addCourseGrade () menghasilkan ralat kerana ia cuba untuk menimpa kaedah Pelajar .
kelas GradStudent akhir: Pelajar umum Ini memberi kesan lebih daripada sekadar kaedah maya kelas. Kelas
akhir
tidak dapat diwarisi daripada sama sekali.