Виртуал таянч синфлар
Тўпламли ворисликнинг синфларнинг нисбатан мураккаб шажарасида ҳосилавий синф воситали равишда битта синф икки ёки ундан ортиқ нусхасини ворислик орқали олиши мумкин. Қуйида келтирилган мисол бу ҳолатни намойиш этади:
#include
class Tayanch
{
int x;
public:
int X_Qiymati(){return x;}
void Qiymat_X(int _x){x= _x;}
double y;
};
class Hosila_1 public Tayanch
{
//…
};
class Hosila_2 public Tayanch
{
//…
};
class Hosila_1_2 public Hosila_1, public Hosila_2;
{
//…
};
main()
{
Hosila_1_2 ob;
ob.y=5.0;
ob.Qiymat_X(10);
int z= ob.X_Qiymat();
return 0;
}
Бу мисолда Hosila_1_2 синфи ўзининг таянч синфлари – Hosila_1 ва Hosila_2 синфлари орқали воситали равишда Tayanch синфини ворислик бўйича олади. Натижада Hosila_1_2 синфида Tayanch синфининг иккита нусхаси пайдо бўлади ва Taynch синфининг y ва Qiymat_X() аъзоларига
ob.y=5.0;
ob.Qiymat_X(10);
int z= ob.X_Qiymat();
кўринишидаги мурожаатларга компиляция хатоси юзага келади. Чунки компилятор бу аъзоларнинг қайси нусхасига мурожаат бўлаётганлигини аниқлай олмайди. Бу ўринда «кўришга рухсат бериш» амали ёрдамида қайси таянч синф орқали аждод синфга мурожаат бўлаётганлигини кўрсатиш мумкин:
ob.Hosila_1::y=5.0;
ob.Hosila_1::Qiymat_X(10);
int z= ob.Hosila_1::X_Qiymat();
Гарчи «кўришга рухсат бериш» амалидан фойдаланиш ноаниқликни йўқотгса ҳам, Hosila_1_2 синфида Tayanch синфининг иккита нусхаси пайдо бўлишини йўқ қилмайди. Бу муаммони ҳал қилиш учун компиляторга виртуал таянч синфни ишлатиш ҳақида кўрсатма бериш керак бўлади. Виртуал таянч синфни кўрсатиш учун ворислик кўрсатилдаиган жойда мурожаат хоссасидан олдин ёки кейин virtual калит сўзини ёзиш керак бўлади. Юқоридаги мисолда Hosila_1 ва Hosila_2 синфлар эълонига қуйидаги ўзгартиришлар қилиш орқали Hosila_1_2 синфида Tayanch синфининг иккита нусхаси пайдо бўлишининг олди олинади:
Do'stlaringiz bilan baham: |