Спец часть (часть 2) (3 поток) (2015) (by Кибитова) (1161602), страница 25
Текст из файла (страница 25)
. }; объектов,других(множественноенаследование)классов. информация1. ПриСущность— классоднотипныхо которыхДинамическийполиморфизм,механизмвиртуальныхфункцийинформация:разработкеER-моделиопределяетсяследующаядолжнабытьучтенавмодели.СущностьврамкахООПпредстав-базоКласс,поведениеи структура которого наследуется, называется— списоксущностей,ляетсяклассом.вым (родительским) классом, а класс, который наследует — производным— список атрибутов,классом.2. ПримечаниеЭкземпляр сущности — объект, создаваемый на основе класса.— описание связей.по работепрограммы.ВАтрибутпроизводномклассеструктураи поведениебазовогокласса3.
Комментарийсущности—именованнаяхарактеристика.в ООП— (инфоринСвязимеждусущностямиреализуютсяспомощьюмеханизмовнаслемационныеи методы),и переопределяются.1)формационныйв началечленыработысоздаетсятипа класса C (приэтом через объявчленклассаобъектдополняютсяагрегирования,использования.Агрегация—этоотношениемеждуклассамитипацелое/часть.Агрегиленныйуказательбудутдоступнытолькочлены,дополнительныеунаследованныеотибазовоговдования,производномклассеуказываютсятолькопереопВидымеждуклассами4.отношенийКлючсущности—совокупностьатрибутов,однозначноопредеруемыйклассвтойилиинойформеявляетсячастьюагрегата.Объекткласкласса А).При класса.созданииобъекта сначаласрабатываетконструктор базовогобазовогоределяемыечленыПроизводныйклассявляется уточнениемляющихобъект.класса,создаваяцелочисленныймассив.Таккакдляэтогомассивафактиса-агрегата может хранить объект агрегируемого класса, или хранить ссылкукласса:ческогонапараметра нет, то в качестве размера массива берется значение по(указатель)5.
умолчанию,Связь —него.ассоциациясущностями.в использованииобъектовразработанныхклассовв качествеинфорзаданное типовв междуконструкторебазовогокласса.Затем срабатываетclassz: publicyсоздавая{. .других. дополнительный}; классов. вещественный массив.конструкторклассаС,мационныхчленовприописанииТипысвязей:Пример:в концеработы удаляется созданный объект. Так как деструктор базового— 2)одинк одному,Наследование— отношение между классами, при котором один класс покласса объявлен виртуальным, то сначала срабатывает деструктор текущегоПример:вторяетструктуруи{вещественныйповедениекласса(одиночноенаследование)или— объекта,одинко nodeмногим,class.
. .};//другогоагрегируемыйкласс,описывающийудаляямассив,а затем— деструкторбазового класса,//вершинудеревадругих(множественноеклассов.работы данной программы будетудаляяцелочисленныймассив. В результате—classмногиекомногим. наследование)classtreepointвыданаследующаяинформация:{// класс-агрегат,описывающийдерево. базо{ Класс,поведениеи—структуракоторогоПримерсвязи:группастуденты.Связь наследуется,можетиметь называетсяоднуиз двухnode*//единственныминформационнымчленомintx,y;root;вым (родительским)классом,акласс,которыйнаследует—производным//являетсяуказательнавыделеннуюpublic:модальностей:A() — C()Агрегацияэтоотношениемеждуклассамитипа целое/часть.
Агреги// вершину— корень дерева{ . size. .}size int()= 10double= 5классом. point—может(можетбыть,аможетинебыть),~C() в~A()руемый классилиx1,инойpublic:point(тойintintформеy1 ) является{ . . .}частью агрегата. Объект клас()хранить{ классеrootобъект=структура0; }. tree.можетВ. производноми поведениебазовогокласса (инфорса-агрегатаагрегируемогокласса,или хранитьссылку. члены. .};мационныеиметоды),дополняютсяипереопределяются.(указатель)3)};Еслинабынего.деструктор базового класса не был объявлен виртуальным, то при66удалениис типомуказателяpp1 для объектабыл быв производномклассев соответствииуказываютсятолькодополнительныеи переопclassz1 объектавызвантолькодеструкторбазовогокласса.врезультатевещественныймассив{ Пример:ределяемыечлены класса. Производный класс является уточнением базовогоpointp; является испециальнымКомпозициявидомагрегирования(такназыосталсябынеудаленным,былабывыданаинформация:класса:Видыотношениймеждуклассамиintz;ваемоеpublic:сильное агрегирование). Композиция объектов заключается9.2.
Агрегация9.1. Наследование9.2. Агрегацияclassnode { . . .};// агрегируемый класс, описывающийA() ( C()z1int z2 ) y{ {.. //.. .вершинудереваclass.=}};size z:int public= 10 size double5. .. treeclass~A()67в использованииобъектов типовразработанных классовв качествеинфор};{// класс-агрегат,описывающийдерево.node* root;// единственныминформационным членоммационных членовпри описаниидругих классов.z1*= new наz1(1);4) z3Несмотрято, что методsc() в классеC является// являетсяуказательнавиртуальным,выделенную он недоступен напрямую через указательpp1, —таккак этогометода нет в структуре// вершинукореньдереваПример:public:классаA.
Поэтому для вызова этого метода для созданного объекта черезИспользование—rootотношениеtreepp(){= 0; } между классами, при котором одинуказатель1 требуется преобразование:. .класс в своей .реализациииспользует в той или иной форме реализациюclasspoint};объектовкласса.Агрегация— этоотношение между классами типа целое/часть. Агреги{ другого((C*)pp1)int x,y;руемыйклассвтойили инойформеобъектовявляетсядругогочастью классаагрегата.ОбъекткласИспользованиеоднимклассомможетпроявpublic:Композицияявляетсяспециальнымвидомагрегирования(такназыса-агрегатаможетобъектагрегируемогохранить intссылкуСдругойбыв классес был описанкласса,метод силипрототипом:sa(),point()хранить{ если.
. образов:.}лятьсяоднимизстороны,следующихваемоесильноеагрегирование).Композицияобъектовзаключается(указатель)нанего.point(intx1,inty1){...}то он был бы виртуальным и по операции pp1−>sa() сработал бы его алгоритм,—а Имякласса sa(),используетсяв профилеметодадругого класса. алгоритм. одного.неметодаобъявленногов базовомклассе.};— Пример:В теле метода одного класса создаётся локальный объект другого67классаz1class{— classМетододногообращаетсяк методукласс,другогоописывающийкласса (не совсемnode. . .};//агрегируемыйpointp; { класса//вершинудеревачастныйслучай предыдущего способа использования, так как приint z;classtreepublic:вызовестатическихклассов локальныйобъект недерево.создаётся).{ z1 ( int z2 ) {членов//описывающий. .класс-агрегат,.
}root;// единственным информационным членом. . node*.// является указатель на выделенную};// вершину — корень дереваДляреализациимеханизма виртуальных функций используется специальz1* public:z3 = new z1(1);tree () с{полиморфнымroot = 0; } типом, массив указателей на виртуальныеный, связанный. . .методыкласса.Такоймассив называется Таблицей Виртуальных Методов};Использование— отношение между классами, при котором один9.2.
Агрегация11.2. Реализация виртуальныхфункций(ТВМ). в каждый полиморфный объект компилятор неявно помещает укакласс в своей реализации использует в той или иной форме реализациюзатель, условно обозначаемый какобъектовдругого класса.Композицияявляется специальным видом агрегирования (так называемоесильное агрегирование).КомпозициязаключаетсяИспользованиеодним классом объектовдругогообъектовкласса можетпроявvtbl* pvtbl;ляться одним из следующих образов:67Имя одного классаиспользуетсяпрофилеметода другогоклассана—соответствующуюТВМ,хранящуюв адресавиртуальныхметодов.— В теле метода одного класса создаётся локальный объект другогоклассаный, связанный с полиморфным типом, массив указателей на виртуальныеметоды класса.
Такой массив называется Таблицей Виртуальных Методов(ТВМ). в каждый полиморфный объект компилятор неявно помещает указатель, условно обозначаемый какvtbl* pvtbl;на соответствующую ТВМ, хранящую адреса виртуальных методов.В ТВМ типа-наследника имеющиеся адреса одинаковых методов заВ ТВМтипа-наследникаимеющиесяадресаметодовзамещаются,а новые— дописываютсяв конец.Так, одинаковыхесли бы в классеС был86мещаются,а сновые— дописываютсяв конец.Так,еслибы в классеВметодТВМтипа-наследникаадресаодинаковыхзаописанпрототипомint saимеющиеся(), то ТВМдляклассаС имелабыметодоввид:С былописанметодс прототипомint sa(), то ТВМдля Так,классаС имелабы вид:С былмещаются,а новые— дописываютсяв конец.еслибы в классе:: (), &A() для класса С имела бы вид:описан метод с прототипом intAsaто~ТВМA:: & ~A()CA:::: &&sa~()A()()C:: & saCC:::: &&~saC()C:: & ~C()()CC:::: &&sc~()C:: & scC()()ТаккакуказательнаТВМнаходитсяначале объекта, то онДинамический полиморфизм, механизмфункцийC:: виртуальных& sc() в самомТаккакуказательнаТВМнаходитсявсамомначалеобъекта,ондоступен всегда, каким бы ни был тип указателя на объект.Конечно,притоэтомТаккак бытьуказательнаходитсясамомначалеобъекта,ондоступенвсегда,какимбынаниТВМбыл типна объект.Конечно,притоэтомизТВМмогутвыбранытолькотеуказателяметоды,в которыеимеютсяв структуредоступенвсегда,какимбынибылтипуказателянаобъект.Конечно,приэтомизТВМмогутбытьвыбранытолькотеметоды,которыеимеютсявструктуреуказателя (входят в так называемый интерфейс), То есть, как показаноизТВМ могутбытьтолько тетипаметоды,которыеструктуре(входятввыбранытакпроизводногоназываемыйинтерфейс),То имеютсяесть,какв указательпоказанообрабатываетсячерезвуказателяпримере,еслиобъектуказателя(входятвтакназываемыйинтерфейс),Тоесть,какпроизводноготипаобрабатываетсячерезуказательвпримере,еслиобъектбазового типа, то из ТВМ данного объекта можно вызывать толькопоказановиртупроизводноготипаобрабатываетсячерезуказательв примере,еслитообъектбазовоготипа,из ТВМданногообъектаможновызыватьпритольковиртуальныеметоды,перечисленныев базовомтипе.Естественно,этомбудетбазовоготипа,тоиз ТВМданногообъектаможновызыватьвпритолькоальныеметоды,перечисленныев базовомЕстественно,этом виртубудетвыполнятьсяалгоритм,определенныйдлятипе.данногообъектасоответствииЧистаявиртуальнаяфункция—функциявида:альныеметоды,перечисленныевбазовомтипе.Естественно,приэтомбудетвыполнятьсяалгоритм,определенныйдляданногообъектавсоответствиис его типом.свыполнятьсяего типом.