Qoida: Hech qachon konstruktorlar yoki destruktorlar tanasidagi virtual funksiyalarni chaqirmang.
Virtual funktsiyalarning yetishmasligi. "Agar virtual funktsiyalar bilan hamma narsa yaxshi bo'lsa, nega barcha usullarni virtual qilmaslik kerak?" - deb so'raysiz. Javob: "Bu samarasiz!" Virtual metod chaqiruvini qayta ishlash va bajarish odatdagi usul chaqiruvini qayta ishlash va bajarishdan ko'ra ko'proq vaqt talab etadi. Bundan tashqari, kompilyator bir yoki bir nechta virtual funktsiyalarga ega bo'lgan har bir sinf obyekti uchun bitta qo'shimcha ko'rsatkich ajratishi kerak.
Abstrakt funksiyalar va sinflar.Shu nuqtaga qadar biz barcha virtual funktsiyalarimizning ta'riflarini yozdik. Biroq, C++ sof virtual funksiyalar (yoki “mavhum funksiyalar”) deb ataladigan maxsus turdagi virtual funksiyalarni yaratishga imkon beradi, ularda umuman ta’rifi yo‘q! Ular avlod sinflari tomonidan qayta aniqlanadi.
Sof virtual funktsiyani yaratishda virtual funktsiyani aniqlash (tanasini yozish) o'rniga, biz shunchaki 0 qiymatini beramiz.
#include
using namespace std;
class Parent
{
public:
const char* sayHi() { return "Hi"; } // oddiy virtual bo'lmagan funksiya
virtual const char* getName() { return "Parent"; } // oddiy virtual funksiya
virtual int getValue() = 0; // toza virtual funksiya
int doSomething() = 0; // kompilyatsiya xatosi: virtual bo'lmagan funksiyalarni
//0 ni ta'minlab bo'lmaydi
};
int main()
{
return 0;
}
Shunday qilib, biz kompilyatorga aytamiz: "Avlod sinflari ushbu funksiyani amalga oshirish uchun javobgar bo'ladilar."
Sof virtual funksiyadan foydalanish ikkita asosiy ta'sirga ega. Birinchidan, bir yoki bir nechta sof virtual funksiyalarga ega bo'lgan har qanday sinf obyektlarini yaratib bo'lmaydigan mavhum sinfga aylanadi! Agar biz Parent sinfining ob'ektini yaratsak nima bo'lishini ko'rib chiqamiz:
int main()
{
Parent parent; // biz mavhum sinf obyektlarini yarata olmaymiz,
//lekin tajriba uchun buni mumkin deb tasavvur qiling.
parent.getValue(); // bu kod qatorining natijasi nima?
}
Biz getValue() metodini aniqlamaganimiz uchun parent.getValue() natijasi qanday?
Ikkinchidan, mavhum ajdod-sinfning barcha avldo sinflari barcha sof virtual funktsiyalarni qayta aniqlashi kerak, aks holda ular ham mavhum sinflar hisoblanadi.