Virtual kalit so'zdan foydalanish. Agar funktsiya virtual deb belgilangan bo'lsa, ularning yonida virtual kalit so'zi aniq ko'rsatilmagan bo'lsa ham, barcha mos keladigan qayta aniqlanishlar ham virtual hisoblanadi. Biroq, avlod sinflari metodlari yonida virtual kalit so'zning mavjudligi bu metodlar oddiy emas, balki virtual ekanligini foydali eslatma bo'lib xizmat qiladi. Shuning uchun, agar bu juda zarur bo'lmasa ham, virtual kalit so'zni avlod sinflarida bekor qilish yoniga qo'shish foydalidir.
Virtual funksiyalarning turlarini qaytarish. Virtual funktsiyaning qaytish turlari va uning qayta aniqlanishi mos kelishi kerak. Quyidagi misolni ko'rib chiqamiz.
class Parent
{
public:
virtual int getValue() { return 7; }
};
class Child: public Parent
{
public:
virtual double getValue() { return 9.68; }
};
Bu holda Child::getValue() Parent::getValue () uchun mos qayta aniqlanish sanalmaydi, chunki qaytarish turlari har xil (Child::getValue() metodi butunlay alohida funksiya hisoblanadi).
Konstruktorlar yoki destruktorlar tanasidagi virtual funktsiyalarni chaqirmang. Yangi o’rganuvchilar uchun yana bir tuzoq. Konstruktorlar yoki destruktorlar tanasida virtual funktsiyalarni chaqirmaslik kerak. Nega?
Child sinfining obyektini yaratganingizda, avval ushbu obyektning ajdodi, keyin esa avlodi yaratilishini unutmang? Agar virtual funktsiyani Parent sinfi konstruktoridan chaqirsangiz ham, yaratilgan obyektning pastki qismi hali yaratilmagan bo'lsa ham, u holda ajdod o'rniga avlod metodini chaqirib bo'lmaydi, chunki avlod obyekt ishlash uchun. Child sinf metodi bilan hali yaratilmagan. Bunday hollarda usulning asosiy versiyasi C++ da chaqiriladi.
Xuddi shunday muammo destruktorlar bilan ham mavjud. Agar siz virtual funktsiyani ajdod-sinf destruktorining tanasida chaqirsangiz, u holda Ajdod-sinfning usuli har doim chaqiriladi, chunki obyektning pastki qismi allaqachon yo'q qilinadi.
Dostları ilə paylaş: |