Resolusi Nama Bergantung dalam Pewarisan Templat
Dalam C , keupayaan untuk mengakses pembolehubah yang diwarisi bergantung pada jenis pewarisan dan konteks. Pertimbangkan kod berikut, di mana Bar mewarisi daripada kelas templat Foo:
template<class T> class Foo { ... }; template<class T> class Bar : public Foo<T> { ... };
Dalam senario ini, persoalan timbul: bolehkah Bar mengakses pembolehubah dilindungi a Foo?
Pematuhan Standard dan Rasional
Versi baharu pengkompil GNU C mematuhi standard C, yang menyatakan bahawa nama yang tidak layak dalam templat adalah tidak bergantung. Ini bermakna nama-nama ini mesti diselesaikan apabila templat ditakrifkan. Walau bagaimanapun, memandangkan takrif kelas asas bergantung (Foo) tidak diketahui pada masa itu, nama yang tidak layak dalam Bar tidak boleh diselesaikan.
Penyelesaian: Resolusi Nama Eksplisit
Untuk mengakses a, Bar mesti menyatakan dengan jelas nama layaknya: Foo
using Foo<T>::a; int c = a * 4; // Accesses 'a' through namespace resolution
Kesimpulannya, walaupun kelihatan intuitif untuk Bar untuk mewarisi pembolehubah dilindungi a daripada Foo, piawaian C menyatakan bahawa ini hanya mungkin. melalui resolusi nama yang jelas atau pengisytiharan "menggunakan". Ini memastikan gelagat yang konsisten dan jelas merentas instantiasi templat yang berbeza.
Atas ialah kandungan terperinci Bagaimanakah Kelas Templat Boleh Mewarisi dan Mengakses Ahli Yang Dilindungi daripada Kelas Asas Bergantungnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!