class Jonivor
{
public:
Jonivor(char * nomi)
{
Nomi=new char[15];
strcpy(Nomi,nomi);
};
virtual void Ovozi()=0;
virtual void Ozuqasi()=0;
protected:
char * Nomi;
};
class Kuchuk: public Jonivor
{
public:
Kuchuk(char * nomi):Jonivor(nomi){};
void Ovozi()
{cout<
void Ozuqasi()
{cout<
};
class Mushuk: public Jonivor
{
public:
Mushuk(char * nomi):Jonivor(nomi){};
void Ovozi()
{cout<
void Ozuqasi()
{cout<< Nomi<<” ozuqasi: Sut”<
};
int main()
{
Mushuk mushuk(“Baroq”);
Kuchuk kuchuk(“Tuzik”);
mushuk.Ovozi();
mushuk.Ozuqasi();
kuchuk.Ovozi();
kuchuk.Ozuqasi();
}
Бу мисолнинг эътиборли томони шундаки, Jonivoz синфида ovozi() ва oziqasi() абстракт функциялар эълон килинган. Бу функцияларни конкретлаштиришнинг имкони йўқ, чунки Jonivoz синфи ҳайвонлар шажарасини аниқлаб берувчи, умумлаштирувчи синф ва конкрет ҳайвон аниқланмагунча овозининг қандай бўлиши ва нима билан озиқланишини билиб бўлмайди. Лекин, аксарият ҳайвонлар овоз чиқаради ва албатта озиқланади. Шу сабабли, ovozi() ва oziqasi() функциялар умумий бўлиб, у Jonivoz синфида мавҳум ҳолда эълон қилинган. Бу функциялар Kuchuk ва Mushuk синфларида конкретлаштирилган (мажбурий равишда).
Программа ишлаши натижасида экранга қуйидаги хабарлар чиқади:
Baroq ovozi: Miyov
Baroq ozuqasi: Sut
Tuzik ovozi: Vov
Tuzik ozuqasi: Go’sht
Абстракт синф билан боғлиқ яна бир ўзига хос ҳолат шундан иборатки, агар абстракт синф конструктори бевосита ёки билвосита соф абстракт функцияни чақирса, нима рўй беришини олдиндан айтишнинг иложи йўқ.
Соф абстракт функциялар тавсифига «зид» равишда бундай функциялар абстракт синфда нафаыат эълон қилиниши, балким аниқланиши ҳам мумкин. Улар қуйидаги синтаксис асосида бевосита чақирилиши мумкин:
<абстракт синф номи>::<абстракт функция номи>
(<параметрлар рўйхати>)
Одатда бу синтаксисдан соф виртуал деструкторга эга синфлар шажарасини яратишда фойдаланилади:
Do'stlaringiz bilan baham: |