Наследяването на език, с

модификатори на наследството

Ние сме най-накрая е готов да се говори за наследство. Това е една от най-интересните качества на ++ езика C. Наследяване на C ++ - механизъм, чрез който един клас може да наследи характеристиките на друг. Наследяването позволява да се изгради йерархия на класове, движейки се от по-общо към по-конкретни.

Когато клас се унаследява от друг клас, който наследява, тя се нарича получен клас. Наследяване клас се нарича базов клас.

Новият клас се основава на съществуващата структура с помощта на следния вид:

клас майка;
клас на детето. [Модификатор наследство] майка;

При определяне на поколението клас за името му, за да бъде сепаратора, двоеточие (:), а след това - по избор модификатор наследство, името на майка клас. Наследяването модификатор определя видимостта на наследените променливи и методи за потребителя и възможните наследници на класа наследник. С други думи, тя определя какви права на достъп до класа променливи и методи на родителя ще бъдат "делегирани" на клас-наследник. При изпълнението на наследството, района на "видимост" на данните, принадлежащи към класа и методите могат да определят избора на ключови думи частен (частни), публични (обществени) или защитено (защитена), който може да се върти свободно в рамките на класа. С първите две модификатори за достъп вече познатата ни, - частна затворена описва членове на класа, до които достъпът методи са само членове на този клас, обществото се използва за описване на публичните елементи, които могат да бъдат достъпни от всяка точка на програмата. От особен интерес са елементите, които са защитени модификатор за достъп. защитени модификатор се използва, когато е необходимо, че някои членове на базовия клас ще остане скрита, но ще бъдат на разположение за новия клас. Защитена еквивалент лично с едно изключение: защитени членове на базовия клас са на разположение на членовете на всички получени класове на базовия клас.

Така елементите за достъп на база класа на извлечения клас от методи, в зависимост от наследствените модификатори стойността е дадена в таблицата.

От горната таблица, в получен достъп клас към елементите на базовия клас може да се направи по-ограничен, но никога не може да го направи по-малко ограничен.

Конструктори и деструктори, когато наследството

Основният клас, извлечен клас, или и двете могат да имат конструктор и / или деструктор.

Ако в основата и производните класове имат конструктори и деструктори, строителите се изпълняват по реда на наследяване и деструктори - в обратен ред. Т.е. когато А е базовата клас B - получен от А и С - е получен от В (А-В-С), когато обект на клас С предизвикателство дизайнери ще има следната процедура: дизайнер - конструктор Б - С конструктор обаждането в деструктори разрушаването на обекта ще се случи в обратен ред: деструктор - на деструктора - деструктор А.

Разберете модела на такава заповед не е трудно, защото на базовия клас не "знае" за съществуването на новия клас, инициализация се извършва в нея, независимо от новия клас и може да се превърне в основа за инициализация извършва в извлечен клас. От друга страна, тъй като на базовия клас е в основата на производни повикване базов клас деструктор преди получен клас деструктор ще доведе до преждевременна повреда на новия клас.

Тази програма показва следната

Работата на конструктора на базовия клас
производния клас конструктор работата
Работа получен клас деструктор
Работа деструктор на базовия клас

Ние вече говорихме за това, че дизайнерите могат да имат параметри. При прилагането на наследствените оставя предавателни параметри за конструктори и производно на базовия клас. Ако параметърът е само получени аргументи клас конструктори, които се предават по конвенционален начин. Въпреки това, ако е необходимо, да премине аргумент на конструктора на родителския клас, отнема малко повече усилия. На първо място, трябва да се грижи за това да се премине от извлечен клас конструктор базов клас строителя. За тази цел удължи получен запис клас конструктор.

konstruktor_proizvodnogo_klassa (формален списък параметър)
. konstruktor_bazovogo_klassa (действителния списък параметър)
. // получен клас конструктор тяло
>

възможно да се използват същите настройки за базата и извлечения клас. Възможно е, и че списъците на конструкторите параметри, получени и базови класове ще бъдат различни. Освен това, получен клас конструктора не е необходимо да се използват всички аргументи, получени за предаване на база класа, т.е. производния клас конструктора може да приеме някои от аргументите просто просто да ги предаде на строителя на базовия клас, а може би и той не ги използвате.

клас BaseClass
Int I;
публичния:
BaseClass (междинно съединение II)

клас DerivedClass: обществени BaseClass
Int п;
публичния:
DerivedClass (междинно нн, Int т): BaseClass (т)

Възможно е също така, че клас конструктор база може да има повече възможности от производния клас строителя.

клас BaseClass
Int J, I;
публичния:
BaseClass (междинно съединение JJ, Int II)

клас DerivedClass: обществени BaseClass
Int п;
публичния:
DerivedClass (междинно съединение пп);

DerivedClass. DerivedClass (междинно съединение пп): BaseClass (NN / 2, NN% 2)

Пример изграждане класове и наследяване

Като пример, изберете графика, използването на които могат да бъдат полезни в различни области. Разумно е да се започне с един клас, който симулира сградата на физически пиксела на екрана.

Все пак пикселите на екрана, в допълнение към координатите на позицията си, също е в състояние да "светне". Разширяване на структурата:

ENUM булева; // фалшив = 0, вярно = 1
структура Point
Int X;
Int Y;
Булева Видим;
>;

Булев тип е познат на програмистите на Паскал. Този код се използва Enum типа изброяване да се провери истината (истина) или лъжа (фалшиво). Тъй като стойностите на тип изброяване започват от 0, тогава булеви може да има една от следните две стойности: 0 или 1 (вярно или невярно).

Като се има предвид нашия опит с конструкция _3d на, ние трябва да се грижим за интерфейса на Point клас. Ние ще трябва методи за инициализиране на координатите на пикселите и указанията "на", или не. Освен това, ако ние искаме да направим вътрешния променливата не е на разположение, трябва да се осигури начин да разберете това, което е в тях, прочетете техните стойности, регламентирани начин. Следващата версия може да изглежда така:

ENUM булева; // фалшив = 0, вярно = 1
клас Point
<
защитени:
Int X;
Int Y;
Булева Видим;
публичния:
вътр GetX (свободен)
вътр GetY (свободен)
Булева isVisible ()
Point (Конст Point ср); // копирате конструктор прототип
Точка (междинно newX = 0, Int нов Y = 0); // конструктор прототип
>;

Point. Point (инт NewX, вътр NewY) // Конструктор
X = newX; Y = newY; Вижда = фалшива;
>

Point. Point (Конст Point ср) // копирате конструктор
X = cp.X; Y = cp.Y; Вижда = cp.Visible;
>

Сега имаме възможност да декларират обекти от тип точка:

Point център (320, 120); // обект на Point център тип
Точка * point_ptr; // указател към тип Point
point_ptr = &Center; // сочи указателят на Центъра

Създаване аргументите си по подразбиране, когато се описват прототип на конструктора ни позволява да се обадите на строителя без аргументи или с непълен списък от аргументи:

Точка Apoint ();
Точка ред [80]; // масив от обекти от тип Point
Точка bPoint (100);

Докато ние можем да създадете точка обекти на класа и определяне на тяхното местоположение, но ние все още не може да ги покаже. Така че тя трябва да бъде придружено от подходящ Point методи клас.

клас Point
.
публичния:
.
нищожен Show ();
нищожен Hide ();
невалидни MoveTo (междинно newX, Int newY);
>;

нищожен Point :: Show ()
Вижда = вярно;
putpixel (X, Y, getcolor ());
>

нищожен Point :: Hide ()
Вижда = фалшива;
putpixel (X, Y, getbkcolor ());
>

нищожен Point :: MoveTo (инт newX, вътр newY)
Hide ();
X = newX;
Y = newY;
Покажи ();
>

Сега, когато имаме пълна Point клас, можете да създадете точка обекти, връхна точка, закаляване и да ги преместите на целия екран.

Точка точка А (50,50);
pointA.Show ();
pointA.MoveTo (100,130);
pointA.Hide ();

Ако е необходимо да се създаде клас за друг графичен, а след това един от двата начина, можете да изберете дали да започне нейното изпълнение "от нулата", или да използвате готови Point клас, което го прави основен. Вторият начин изглежда да е за предпочитане, тъй като то е свързано с използването на готови модули, всички по едно и също време, което трябва - е да се създаде нов клас, получени от Point, допълването му с нови условия и методи и / или повторно определяне на някои от методите на базовия клас.

Нека се опитаме да създадем клас за Circle кръг. Кръг в известен смисъл, дебела точка. Той има всичко, което има точка (позиция X и Y и видима / невидима състояние) плюс радиуса. Очевидно, Circle клас изглежда, че има само един елемент на радиуса, но да не забравяме за всички елементи, които наследява кръг, е класа, генерирани от точка. Кръгът е X, Y, и явното, дори ако те не са видими в дефиницията на клас за кръг.

клас Circle: обществен Point
Int радиус; // лично по подразбиране
публичния:
Кръгът (междинно initX, Int initY, Int initR);
нищожен Show ();
нищожен Hide ();
нищожен Expand (INT deltaR);
нищожен договор (Int deltaR);
невалидни MoveTo (междинно newX, Int newY);
>;

Кръгът :: Circle (инт initX, вътр initY, вътр initR) // Конструктор
: Point (initX, initY) // наричам базов клас конструктор
Радиус = initR;
>

нищожен Circle :: Show ()
Вижда = вярно;
кръг (X, Y, Радиус);
>

нищожен Circle :: Hide () // скрие скица фоновия цвят =
Вижда = фалшива;
неподписан Int tempColor = getcolor ();
setcolor (getbkcolor ());
кръг (X, Y, Радиус);
setcolor (tempColor);
>

нищожен Circle :: Expand (INT deltaR)
Hide ();
Радиус + = deltaR;
Покажи ();
>

нищожен Circle :: договор (инт deltaR)
Разширяване (-deltaR);
>

нищожен Circle :: MoveTo (инт newX, вътр newY)
Hide ();
X = newX;
Y = newY;
Покажи ();
>

Основната ()
Int graphDr = откриване, graphMode;
initgraph ( graphDr, graphMode, "");

Кръгът C (150,200,50); // създаде обект на окръжност с център в г. (150, 200) и радиус 50
C.Show (); // показват кръга
getch ();
C.MoveTo (300,100); // ход
getch ();
C.Expand (50); // участък
getch ();
C.Contract (70); // преса
getch ();

Тъй кръг на клас - е получен от точка клас, съответно, кръг клас наследява от клас състояние точка Х, Y, видими и методи isVisible (), GetX (), GetY (). Що се отнася до методи за Show (), Hide () и MoveTo () клас Circle, необходимостта да се замени ги продиктувано от спецификата на нов клас обекти, като, например, показват кръг - не е същата като тази, показана с точки.

Забележете, че методите на кръга изискват достъп до различни елементи от данни в класовете кръг и точка. Помислете кръг :: Разширете. Тя изисква достъп до Radius. Това не е проблем. Радиус се определя като частно в кръг. Затова на разположение на всички функционални елементи на класа на радиуса на окръжността.

А сега да разгледаме Circle :: Hide и Circle :: Show. Те изискват достъп до Видим от своя базов клас Point. В този пример, Видим е защитена точката за достъп. Кръг се генерира от точката за публичен достъп. Ето защо, Видим е защитен достъп в рамките на кръг. Имайте предвид, че ако се вижда определя като частно в Point, че ще бъде на разположение за функциите на елементи кръг. Това би било възможно да се направи публично Видим в интернет. Въпреки това, в този случай, Видима ще направи достъпно за функции, които не са елементи.

тип съвместимост

Наследявайки исканията си с правилата на видове със съвместимостта.

В допълнение към всичко останало, генерирани тип наследява съвместимост с всички видове родоначалник. Тази разширена съвместимост има три форми:

  • между случаи на обекти,
  • указатели между обектите,
  • между формални и действителните параметри.

Въпреки това, и в трите форми не трябва да забравяте, че видовете съвместимост се разпространява от дете на майка. С други думи, генерирани класовете могат да се използват свободно, на мястото на класовете прародител, но не и обратното.

Точка Apoint, * ptrPoint;
Кръгът ACircle, * ptrCircle;

Назад задача е незаконно.

Майка обект могат да бъдат причислени към обект на всеки клас, генерирани от тях.

За да направи по-лесно да се помни, начинът на съвместимостта на видове, нека да говорим по този начин:

1. Източникът трябва да изпълни изцяло дестинация обект,
2. генерирани видове съдържат всички съдържат родителски видове по наследство. Следователно, генерирани тип ще има или същия размер, или (обикновено) по-голям от своя предшественик, но не по-малка.

Присвояване на обект родител генерирана да оставите някои полета потомък несигурни след назначението. Което е много опасно.

Предложенията на заданието за копиране само тези полета, които са общи за двата вида, т.е. само поле прародител.

типове съвместимост също са валидни между указатели към класове. Указатели към потомци да зададете указатели към предците на същите общи правила като за обект случаи.

В официално параметър на даден клас на обекта може да се използва като действително параметър обект на същия клас или всяка получена клас. Например,

нищожен Proc (Point Парам)

Тогава действителните параметри могат да бъдат от тип точка, кръг и всякакъв друг вид, генерирани от тях.

Знаете ли, че абстрактен клас - клас, който съдържа най-малко един виртуален метод. Абстрактни класове не са изолирани, т.е. Винаги абстрактен клас, трябва да бъде наследен. От чисто виртуална метод не е тялото, можете да създадете абстрактен клас обект не може да бъде. Абстрактен клас може да се нарече клас дефинирали специално за характеристиките на наследяване, генерирани от класовете.

Новини
Knights етер теория