Langkah berjaga-jaga berikut mesti dipatuhi semasa menulis semula fungsi: Tanda tangan fungsi adalah sama Pengubah suai akses tidak boleh lebih ketat daripada tanda const atau override untuk menulis semula Hanya fungsi maya yang boleh disembunyikan fungsi kelas, berbilang penggantian dan Tulis Semula yang tidak disengajakan. Gunakan penggantian dengan betul dan pertimbangkan perangkap untuk mengelakkan tingkah laku yang tidak dijangka.
C++ Fungsi Menulis Semula Langkah Berjaga-jaga dan Kesalahan
Fungsi menulis semula, dalam pengaturcaraan berorientasikan objek, merujuk kepada keupayaan subkelas untuk mengatasi fungsi dengan nama yang sama dalam kelas asas. Ia adalah mekanisme yang kuat, tetapi ia boleh mendatangkan masalah jika digunakan secara tidak betul.
Nota:
-
Tandatangan fungsi mestilah sama: Fungsi yang diganti mesti mempunyai senarai parameter dan jenis pulangan yang sama seperti fungsi kelas asas.
-
Pengubah suai akses tidak boleh lebih ketat: Pengubah suai akses bagi fungsi subkelas tidak boleh lebih ketat daripada fungsi kelas asas. Sebagai contoh, jika fungsi kelas asas adalah awam, fungsi subkelas tidak boleh dilindungi atau peribadi.
-
const atau override: Gunakan const atau override kata kunci untuk menunjukkan dengan jelas bahawa fungsi tersebut adalah untuk mengatasi fungsi kelas asas, dan bukannya menambah fungsi baharu.
-
Fungsi maya: Hanya fungsi maya boleh ditindih. Fungsi kelas asas boleh diisytiharkan sebagai maya dengan menggunakan kata kunci maya.
Perangkap:
-
Menyembunyikan fungsi kelas asas: Jika fungsi subkelas mempunyai tandatangan yang sama seperti fungsi kelas asas tetapi dengan pengubah suai akses yang lebih longgar, ia akan menyembunyikan fungsi kelas asas dan bukannya mengatasinya.
-
Timpa berbilang: Sesuatu fungsi hanya boleh ditindih dalam subkelas tunggal. Jika berbilang subkelas cuba mengatasi fungsi yang sama, pengkompil akan melaporkan ralat.
-
Timpa tidak disengajakan: Jika fungsi subkelas kebetulan mempunyai tandatangan yang sama seperti fungsi kelas asas tetapi sebenarnya tidak bertujuan untuk mengatasinya, ini boleh membawa kepada tingkah laku yang tidak dijangka.
Kes praktikal:
Pertimbangkan contoh kelas asas dan subkelas berikut:
class Base {
public:
virtual void print() const {
std::cout << "Base::print() called" << std::endl;
}
};
class Derived : public Base {
public:
void print() const override {
std::cout << "Derived::print() called" << std::endl;
}
};
Salin selepas log masuk
Di sini, kelas Terbitan mengatasi fungsi print() kelas Asas, dan fungsi subkelas mengatasi fungsi dan output kelas asas dengan betul Mesej yang berbeza.
Petua untuk mengelakkan perangkap:
- Gunakan const atau override secara eksplisit untuk menunjukkan overriding.
- Periksa sama ada pengubah suai akses adalah betul.
- Pastikan anda hanya menimpa fungsi jika anda berhasrat untuk mengatasinya.
- Semak dua kali tandatangan fungsi untuk mengelakkan timpa tidak sengaja.
Atas ialah kandungan terperinci Nota dan perangkap penulisan semula fungsi C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!