Konstruktorni himoyalangan qilib, Animal sinfi obyektlarini yaratishni taqiqladik. Biroq, ikkita muammo saqlanib qolmoqda:
Nima bo'ldi? Biz speak () metodini qayta aniqlashni unutib qo‘ydik, shuning uchun lion.speak () Animal.speak () deb nomlandi va biz yuqoridagi natijani oldik.
using namespace std;
class Animal // Animal sinfi mavhum sinfdir
{
protected:
std::string m_name;
public:
Animal(std::string name)
: m_name(name)
{
}
std::string getName() { return m_name; }
virtual const char* speak() = 0; // sof virtual funksiya
};
Bu yerda diqqat qilish kerak bo'lgan bir nechta narsa bor. Birinchidan, speak() endi sof virtual funktsiyadir. Bu shuni anglatadiki, Animal endi abstrakt ajdod-sinf bo'lib, biz protected spetsifikatsiyaga muhtoj emasmiz (garchi bu ortiqcha bo'lmasa ham). Ikkinchidan, bizning Lion sinfimiz Animal sinfining avlodi bo'lganligi sababli, lekin biz Lion :: speak () ni aniqlamaganimiz uchun, Lion ham abstrakt sinf hisoblanadi. Shuning uchun, agar biz quyidagi kodni kompilyatsiya qilishga harakat qilsak:
#include
#include
using namespace std;
class Animal // Animal sinfi mavhum sinfdir
{
protected:
std::string m_name;
public:
Animal(std::string name)
: m_name(name)
{
}
std::string getName() { return m_name; }
virtual const char* speak() = 0; // sof virtual funksiya
};
class Lion: public Animal
{
public:
Lion(std::string name)
: Animal(name)
{
}
// speak() metodini qayta aniqlashni unutdik
};
int main()
{
Lion lion("John");
std::cout << lion.getName() << " says " << lion.speak() << '\n';
}
Keyin biz Lion abstrakt sinf ekanligini va abstrakt sinf obyektlarini yaratish mumkin emasligini bildiruvchi xatoga duch kelamiz. Bundan xulosa qilishimiz mumkinki, Lion sinfining obyektini yaratish uchun biz speak() metodini qayta aniqlashimiz kerak:
class Lion: public Animal
{
public:
Lion(string name)
: Animal(name)
{
}
virtual const char* speak() { return "RAWRR!"; }
};
int main()
{
Lion lion("John");
cout << lion.getName() << " " << lion.speak() << "deydi ";
}
Endi quyidagi natijani olish mumkin:
Jon RAWRR deydi!
Sof virtual funktsiya bizda ajdod sinfiga qo'ymoqchi bo'lgan funktsiyaga ega bo'lsak foydali bo'ladi, lekin realizatsiyani avlod sinflariga qoldiring. Abstrakt ajdod sinfning sof virtual funksiyasi avlod sinflarini ushbu funktsiyani qayta aniqlashga majbur qiladi, aks holda bu sinflarning obyektlarini yaratish mumkin bo'lmaydi.