Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Жалғызданған және көпше түрдегі мұрагерлік






1.1. Жалғ ызданғ ан мұ рагерлік

Жалғ ызданғ ан мұ рагерлік екі калсс арасындағ ы туыстық ты сипаттайды: олардың біреуі екіншісін мұ рагерленеді. Иерархияның шың ында орналасқ ан класс базалық деп аталады. Басқ аларын туынды кластар деп атайды. Бір кластан кө птеген кластар туындауы мү мкін, бірақ байланыс тү рі жә й тұ қ ымқ уалау болып қ ала береді. Базалық класты атаналық, ал туынды класты – мұ рагерлік деп атайды

Туынды класс базалық кластан конструкторлар мен деструкторлардан басқ а, тек мү ше-мә ліметтерді жә не мү ше-функцияларды мұ рагерленеді.

 

class Tbase { //Базалық класс

private:

int count;

public:

TBase() {count = 0; }

void SetCount(int n) {count = n; }

int GetCount(void) {return count; }

};

class TDerived: public TBase { //Туынды класс

public:

TDerived(): Tbase() {}

void ChangeCount(int n) {SetCount(GetCount() + n); }

};

 

Туынды класс TDerived деп аталады. Атынан кейін қ ос нү кте жә не келесі кілттік сө здердің біреуі – public, protected, private болады. Бұ лардан кейін базалық класс аты TBase болады. Ашық кластың ашық мү шелері туынды класта да ашық болады:

 

class TDerived: public TBase {}

 

Tbase-тың барлық жабық мү шелеріTderived-те жабық болады, оларғ а ену мү мкіндігі болмайды. Базалық класты жабық тү рде сипаттауғ а болады:

 

class TDerived: private TBase {}

 

Базалық кластағ ы ашық мү шелер TDerived-те жабық болады. TDerived-ты мұ рагерленетін кластар TBase мү шелеріне ене алмайды. Туынды класта конструктор болады, егер ол базалық та болса. Ол базалық класс коснтрукторын шақ ыруы тиіс:

 

TDerived(): TBase() {}

 

Бұ дан басқ а да ә рекеттер орындалуы мү мкін, мысалы:

 

TDerived(): TBase() {cout < < " I am being initialized" < < endl; }

 

Хабарланғ ан конструкторды дербес жү зеге асыруғ а болады:

 

TDerived:: TDerived()

: TBase()

{ // операторлар

}

 

Туынды класс базалық кластан count-ты мұ рагерленеді, бірақ ол TBase-те жабық болғ андық тан оғ ан ену тек TBase класының функция-мү шелері арқ ылы ғ ана мү мкін болады. Туынды класта TBase класының мұ рагерлік функция-мү шелеріне енетін функцияны анық тауғ а болады:

 

void ChangeCount(int n) {SetCount(GetCount() +n); }

 

Кластың қ орғ алғ ан мү шелері – ол ашық жә не жабық мү шелері арасындағ ы мү шелер. Жабық мү шелер сияқ ты олар тек функция-мү шелерге ғ ана кө рінеді. Кластан тыс олар қ олданылмайды. Ашық мү шелер секілді олар туынды класс функция-мү шелеріне ғ ана кө рінеді.

- жабық мү шелер хабарланғ ан класта ғ ана кө рінеді;

- қ орғ алғ ан мү шелер ө зіндік класс мү шелеріне жә не туынды класс мү шелеріне кө рінеді;

- ашық мү шелер ө зіндік класстың да, туынды кластың да, осы класты пайдаланатын қ алғ ан мү шелерге де кө рінеді.

 

Спецификаторлар (public, private, protected) мұ рагерленетін мү ше статусына ә сер етеді:

- ашық базалық класс мү шелері туынды класта ену мү мкінідігінің специфкацияларын сақ тайды;

- қ орғ алғ ан базалық кластың ашық мү шелері туынды класта жабық болады.

Қ орғ алғ ан жә не жабық мү шелер ө зідерінің бастапқ ы спецификацияларын сақ тайды;

- жабық базалық кластың барлық мү шелері бастпақ ы ену спецификациясынан тә уелсіз туынды класта жабық болады.

Егер туынды класта мұ рагерленетін мү шелердің кейбіреуін ғ ана ашық етіп қ алдырғ ың ыз келсе, олардың біреуін немесе бірнешеуін квалификациялауғ а болады.

class A {

public:

int x;

A() { x=0; }

void Display(void) { count < < " x = " < < x < < endl; }

};

class B: private A {

public:

A:: Display; // кластың ашық мү шесі ретінде квалификациялаймыз

B(): A() {}

};

 

Туынды класта деструктор бір нә рсені жою керек болғ анда ғ ана қ ажет болады.

// Программа 1

#include < iostream.h>

#include < string.h>

class TBase { //Базалық класс

private:

char *basep;

public:

TBase(const char *s) {basep = strdup(s); }

~TBase() {delete basep; }

const char *GetStr(void) { return basep; }

};

class TDerived: public TBase { //Туынды класс

private:

char *uppercasep;

public:

TDerived(const char* s): TBase(s) { uppercasep = strupr(strdup(s)); }

~TDerived() {delete uppercasep; }

const char *GetUStr(void) { return uppercasep; }

};

void main()

{

TBase president(" George Washington");

cout < < " Original string: " < < president.GetStr() < < endl;

TDerived pres(" George Washington");

cout < < " Uppercase string: " < < pres.GetUStr() < < endl;

}

Туынды класта ә детте жаң а мә ліметтер мен функция-мү шелер қ осады. Бірақ базалық кластан мұ рагерленген функция-мү шелерін алмастыру мү мкіндігі бар. Мысалы:

//Программа 2

#include < iostream.h>

#include < string.h>

class TBase { //Базалық класс

private:

char *basep;

public:

TBase(const char *s) {basep = strdup(s); }

~TBase() {delete basep; }

void Display(void) { cout < < basep < < endl; }

};

class TState: public TBase { //Туынды класс

public:

TState(const char *s): TBase (s) {}

void Display(void); // ауыстыратын функция

};

void TState:: Display(void)

{

cout < < " State: "; //НЖаң аоператор

TBase:: Display(); //Ауыстырылғ ан функцияны шақ ыру

}

void main()

{

TState object(" Welcome to Borland C++5 programming! ");

object.Display();

}

 

1.2. Кө пше тү рдегі мұ рагерлік

class A { /*…*/ };

class B { /*…*/ };

class C: public A, private B { /*…*/ };

С:: С(int a, char* str): A(a), B(str) { /*…*/ };

 

2. Виртуальді функциялар

Виртуальді функция – бұ л объект типінен тә уелді шақ ырылатын функция ОБП-да программа орындалғ ан уақ ытта объект қ андай функцияны шақ ыру керектігін анық тайтындай виртуальді функцияларды жазуғ а болады. Виртуальді функцияларды қ олдану механизмін кейде полиморфизм деп атайды, ө йткені виртуальді функцияларды қ олданатын объектілер қ олданылып отырғ ан контекстке икемделетін болғ андық тан

Виртуальді функциялар тү сінігін дұ рыс тү сіну ү шін тұ қ ымқ уалау қ атынасымен байланысты С++ класының маң ызды принципімен танысың ыз. С++ ережелеріне сә йкес базалық класқ а кө рсеткіш осы класс объектісіне немесе базалық кластан туындағ ан кез келген туынды класс объектісіне сілтей алады.

Мысал: 3 класс берілген: В класы А класынан туындағ ан, ал С класы В класынна туындағ ан.

A aObject; //Класс объектілерін хабарлау

B bОbject;

C cОbject;

 

Тұ қ ымқ уалаумен байланысты болғ андық тан А класына кө рсеткіш осы объектілердің кез келгеніне сілтеуі мү мкін. Бұ л байланыс бір бағ ытта ғ ана жұ мыс жасайды.

 

A *p;

p = & cОbject;

 

Бұ л принцип туыстық қ атынастағ ы кластарда виртуальді функциялар анық талғ ан жағ дайда маң ызды болады.

 

Бұ л функциялар дә л сондай тү рде болады жә не кә дімгі функциялар сияқ ты программаланады, тек virtual қ ызметші сө зі қ осылады.

 

class A

{ public:

virtual void vf();

};

 

Виртуальді функция параметрлермен хабарлануы мү мкін, басқ а кез келген функция тә різді мә н қ айтаруы мү мкін.

 

class B: public A {

public:

virtual void vf();

};

 

Класта ата-аналық класстың виртуальді функциясының атымен бірдей атты виртуальді функция хабарланғ ан жағ дайда, ондай функция ауыстырғ ыш функция деп аталады. *р кө рсеткіші С типті объектіге сілтейді, сондық тан

 

р-> vf(); // С класының виртуальді функциясын кө рсетеді.

 

// Программа 3 //Виртуальді функция мысалы

 

#include < iostream.h>

class TValue {

public:

virtual double func(double x) { return x*x; }

double culc(double x) { return func(x)/2; }

};

class DValue: public TValue {

public:

virtual double func(double x) { return x*x*x; }

};

void main()

{

TValue obj1;

cout < < obj1.culc(3) < < endl;

DValue obj2;

cout < < obj2.culc(3) < < endl;

}

Таза виртуальді функция – бұ л туынды класпен толтыруды кү тіп тұ рғ ан бос орын. Кә дімгі виртуальді функция сияқ ты хабарланады, тек соң ында = 0-мен аяқ талады.

 

Мысал:

class Abstract {

public:

virtual void f1(void); //кә дімгі виртуальді

virtual void f2(void) = 0; //таза виртуальді

};

Компиляторғ а класстағ ы басқ а функцияларғ а қ арағ анда f2 функция-мү шесінің жү зеге асырылуы қ ажет емес.

Егер класта ең болмағ анда бір таза виртуальді функция-мү шесі болса, ол абстрактілі класс деп аталады. Абстрактілі класс бұ л негізінде туынды класс қ ұ руғ а болатын схема. Абстрактілі класты қ олдану ү шін одан жаң а класс шығ ару керек:

class MyClass: public Abstract {

public:

virtual void f2(void); //кө не таза виртуальді функция

};






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.