Объектга йўналтирилган программалаш


Download 0.58 Mb.
bet56/71
Sana08.05.2023
Hajmi0.58 Mb.
#1444224
TuriПрограмма
1   ...   52   53   54   55   56   57   58   59   ...   71
Bog'liq
С ОЙП

class Tayanch
{
public:
virtual void Virtual_Fun()
{
cout<<"Tayanch::Virtual_Fun()\n";
}
};
class Hosila: public Tayanch
{
public:
virtual void Virtual_Fun()
{
cout<<"Hosila::Virtual_Fun()\n";
}
};
int main()
{
Tayanch * pTayanch =new Hosila;
// Hosila синфидан Virtual_Fun() функциясини чақириш
pTayanch->Virtual_Fun();
//Tayanch синфидан Virtual_Fun() функциясини чақириш
pTayanch->Tayanch::Virtual_Fun();
return 0;
}
Программа экранга
Hosila::Virtual_Fun()
Tayanch::Virtual_Fun()
хабарларини чоп этади.
Кўриниб турибдики,
pTayanch->Tayanch::Virtual_Fun();
кўрсатмаси кечиктирилган боғланишни йўққа чиқаради.
Синфлар шажарасида виртуал функциялар номи билан бир хил қайта юкланувчи функцияларни эълон қилиш мумкин. Лекин, бундай новиртуал функциялар яширинган бўлади.
Юқоридаги фикрларни тасдиқлайдиган мисол келтирамиз:
#include
#include
class Tayanch
{
public:
Tayanch(char * nom){strcpy(Nom,nom);}
virtual void Fun(char c)
{
cout<<"Virtual "<
<
}
protected:
char Nom[20];
};


class Hosila1: public Tayanch
{
public:
Hosila1(char * nom):Tayanch(nom){}
void Fun(const char * s)
{
cout<
<<" parametrini qabul qildi.\n";
}
void Fun(int n)
{
cout<
<<" parametrini qabul qildi.\n";
}
virtual void Fun(char c)
{
cout<<"Virtual "<
<
}
};


class Hosila11: public Hosila1
{
public:
Hosila11(char * nom):Hosila1(nom){}
void Fun(const char * s)
{
cout<
<<" parametrini qabul qildi.\n";
}
void Fun(double d)
{
cout<
<<" parametrini qabul qildi.\n";
}
virtual void Fun(char c)
{
cout<<"Virtual "<
<
}
};
int main()
{
Tayanch tayanch("Tayanch");
Hosila1 hosila1("Hosila1");
Hosila11 hosila11("Hosila11");
tayanch.Fun('X');
hosila1.Fun('Y');
hosila1.Fun(10);
hosila1.Fun("Hos1");
hosila11.Fun('Z');
hosila11.Fun(10.1234);
hosila11.Fun("Hos11");
return 0;
}
Программа бажарилгандан кейин экранда қуйидаги сатрлар пайдо бўлади:
Virtual Tayanch::Fun X parametrini qabul qildi.
Virtual Hosila1::Fun Y parametrini qabul qildi.
Hosila1::Fun 10 parametrini qabul qildi.
Hosila1::Fun Hos1 parametrini qabul qildi.
Virtual Hosila11::Fun Z parametrini qabul qildi.
Hosila11::Fun 10.1234 parametrini qabul qildi.
Hosila11::Fun Hos11 parametrini qabul qildi.
Келтирилган мисолда чизиқли ворисликни ҳосил қилувчи учта синф аниқланган. Tayanch синфида Fun(char) виртуал функция эълон қилинган. Hosila1 синфи Fun(char) виртуал функциясининг ўз вариантини ва иккита қайта юкланувчи новиртуал Fun(const char*) ва Fun(int) функцияларни эълон қилган. Ўз навбатида, Hosila11 синфи Fun(char) виртуал функциясининг ўз вариантини ва иккита қайта юкланувчи новиртуал Fun(const char*) ва Fun(double) функцияларни эълон қилган. Гарчи, Fun(const char*) функцияси Hosila1 синфидаги аналог билан тўла устма-уст тушса ҳам, у Hosila11 синфида қайта эълон қилинган. Чунки, Hosila1 синфида худди шу номдаги виртуал ва новиртуал функциялар мавжудлиги сабабли, Fun(const char*) функцияси яширинган бўлади. Худди шундай, Fun(char) виртуал функцияси Hosila1 ва Hosila11 синфларида қайтадан эълон қилишга тўғри келади, чунки улар ҳам синфларда худди шу номдаги қайта юкланувчи функцияларни мавжудлиги сабабли яширинган бўлади.
Агар ворис синфлардаги виртуал функциялар эълонлари ўчирилса, функциянинг белги аргументли чақиришда, амалда Hosila1 синфидиги Fun(int) функциясини чақириш рўй беради. Таянч синфидаги виртуал функцияни чақириш зарур бўлса, кўриш соҳасига рухсат бериш амалидан фойдаланиш мумкин:
Hosila1.Tayanch::Fun(‘Y’);

Download 0.58 Mb.

Do'stlaringiz bilan baham:
1   ...   52   53   54   55   56   57   58   59   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling