Video: Map of Computer Science 2024
Di C ++, hanya karena Anda berpikir bahwa panggilan fungsi tertentu terlewati tidak berarti itu sebenarnya. Jika tidak dideklarasikan dengan argumen yang sama di subclass, fungsi anggota tidak ditimpa secara polimorfik, apakah dinyatakan tidak bersifat virtual atau tidak.
Satu pengecualian pada aturan deklarasi yang sama adalah bahwa jika fungsi anggota di kelas dasar mengembalikan pointer atau referensi ke objek kelas dasar, fungsi anggota yang ditimpa dalam subkelas dapat mengembalikan pointer atau referensi ke objek subkelas. Dengan kata lain, fungsi makeACopy () bersifat polimorfik, meskipun tipe kembalian dari dua fungsi berbeda:
class Base {public: // kembalikan salinan objek saat ini Base * makeACopy ();}; class SubClass: public base {public: // mengembalikan salinan objek saat ini SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. makeACopy (); // lanjutkan di …}
Dalam prakteknya, ini sangat wajar. Fungsi makeACopy () harus mengembalikan objek tipe SubClass , meskipun mungkin menimpa BaseClass:: makeACopy () .
Bisnis ini diam-diam memutuskan kapan sebuah fungsi diganti dan bila bukan merupakan sumber kesalahan di C ++; begitu banyak sehingga standar 2011 memperkenalkan deskriptor mengesampingkan yang dapat digunakan pemrogram untuk menunjukkan bahwa dia bermaksud untuk mengganti fungsi kelas dasar.
C ++ menghasilkan kesalahan kompilator jika sebuah fungsi dinyatakan mengesampingkan namun sebenarnya, tidak, menimpa fungsi kelas dasar karena beberapa alasan (seperti argumen yang tidak sesuai) seperti pada contoh berikut: >
Potongan ini menghasilkan kesalahan waktu kompilasi karena metode GradStudent:: addCourseGrade (float) telah diumumkan menggantikannya tapi sebenarnya tidak menggantikan fungsi kelas dasar Student:: addCourseGrade (double) karena tipe argumen don ' t cocok
final , walaupun fungsi itu sendiri menggantikan beberapa fungsi kelas dasar sebelumnya, seperti yang ditunjukkan pada tambahan berikut > PostDoc kelas: kelas GradStudent: public Student {public: virtual void addCourseGrade (kelas ganda) final;}; kelas PostDoc: public GradStudent {public: virtual void addCourseGrade (kelas dua);}; Karena Siswa:: addCourseGrade () ditandai akhir
,
deklarasi PostDoc:: addCourseGrade () menghasilkan kesalahan karena mencoba untuk mengganti metode Siswa .
kelas GradStudent final: public Student Ini mempengaruhi lebih dari sekedar metode virtual kelas. Kelas
final
tidak dapat diwarisi sama sekali.