14-ma’ruza. Sinfning virtual metodlari va ularni ishlatish mexanizmlari. Abstrakt sinflar, ularning mo’ljallanishi va xususiyatlari



Yüklə 31,62 Kb.
səhifə4/6
tarix02.12.2022
ölçüsü31,62 Kb.
#71888
1   2   3   4   5   6
14 ma’ruza Sinfning virtual metodlari va ularni ishlatish mexanizmlari

Sof virtual funktsiyaga misol. Amaliyotda sof virtual funksiyaning misolini ko'rib chiqamiz. Oldingi darslardan birida biz Animal ajdod sinfini va Cat va Dog avlod sinflarini yaratdik:

#include


#include
using namespace std;
class Animal
{
protected:
string m_name;
Animal(string name)
{
m_name = name;
}
public:
string getName() { return m_name; }
virtual const char* speak() { return "???"; }
};
class Cat: public Animal
{
public:
Cat(string name)
: Animal(name)
{
}
virtual const char* speak() { return "Meow"; }
};
class Dog: public Animal
{
public:
Dog(string name)
: Animal(name)
{
}
virtual const char* speak() { return "Woof"; }
};

Konstruktorni himoyalangan qilib, Animal sinfi obyektlarini yaratishni taqiqladik. Biroq, ikkita muammo saqlanib qolmoqda:



  • Konstruktor hali ham avlod sinflari uchun mavjud bo'lib, Animal sinfi obyektlarini yaratishga imkon beradi.

  • speak() metodini qayta aniqlamaydigan avlod sinflari hali ham bo'lishi mumkin.

Masalan:
class Lion: public Animal


{
public:
Lion(string name)
: Animal(name)
{
}

// Biz speak () metodini qayta aniqlashni unutdik


};

int main()


{
Lion lion("John");
std::cout << lion.getName() << lion.speak() << " deydi " ;
}

Dastur natijasi: John ??? deydi


Nima bo'ldi? Biz speak () metodini qayta aniqlashni unutib qo‘ydik, shuning uchun lion.speak () Animal.speak () deb nomlandi va biz yuqoridagi natijani oldik.


Yechim sof virtual funksiyadan foydalanishdir:

#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
};

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.





Yüklə 31,62 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin