Виртуалды базалық кластар.
Туынды класс бір базалық класқа бір реттен артық жанама түрде мұрагерленсе, туынды класс объектісіндегі базалық кластың екі көшірмесінің пайда болуын болдырмауға болады, егер базалық класс барлық туынды кластар үшін виртуалды сияқты мұрагерленсе. Мұндай мұрагерлік базалық класқа мұрагерленетін кез келген келесі туынды класта базалық кластың екі (немесе одан да көп ) көшірмелерінің пайда болуына жол бермейді. Мұндай жағдайда базалық класқа өту жолының спецификаторының алдына virtual шешуші сөзін қою керек.
С++ тілінің синтаксисі туынды класқа базалық класты тікелей бірнеше рет беруге тыйым салады:
Class A {…. };
Class B: A,A{….}; // қате
Сонымен бірге базалық класты жанама түрде беруге тыйым салынады:
Class A {…. };
Class B: public A {….}; // қате
Class C:public A, public B {….} // қате
«Қарапайым» мұрагерлік кезінде туынды класс объектісінің құрамына базалық кластың ішкі объектісі кіреді, ал виртуалды мұрагерлік кезінде туынды класс объектісінің құрамына виртуалды базалық кластың ішкі объектісіне жасырын көрсеткіші енеді, оны компилятор виртуалды базалық кластан мұрагерленген мүшелерге жол беруге арналған объектімен жұмыс істегенде айқынсыз қолданылады.
Сlass A {…. };
Class B: virtual public A {….};
Class C: virtual public A, public B // осылай жазуға болады
{….};
Мысалы, Der3 класында Base класының екі көшірмесінің болдырмайтын виртуалды базалық класс қолданылады:
# include
class Base
{ public : int i ; };
class Der1 : vertual public Base
{ public: int j ; };
class Der2 : vertual public Base
{ public: int k ; };
class Der3 : publicDer1, public Der2
{ public: int f( ){return i*j*k;}} ;
int main(void)
Der3 obj ;
// Бір мағынасыздық болмайды, себебі Base класының тек бір көшірмесі ұсынылған.
obj. i=10; obj.j=3; obj.k=5;
cout « ″ нәтежиесі″ « obj .f( ) « endl;
return 0;
}
Достарыңызбен бөлісу: |