|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ПОЛИМОРФИЗМработа с объектами чаще всего производится через указатели, указателю на базовый класс можно присвоить значение адреса объекта любого производного класса. Monstr*p Указатель который ссылается на объект производного класса. P = new daemon; Вызов метода объекта происходит в соответствии с типом указателя, а не фактическим типом объекта, на который он ссылается. Поэтому при выполнении оператора p->draw(1,1,1,1) будет вызван класс монстр а не метод даемон поскольку ссылки на методы разрешаются во время компановки программы – этот процесс называется ранним связыванием. Чтобы вызвать метод класса даемон можно использовать явное преобразование типа указателя. Для определения виртуального метода используется спецификатор virtual Virtual void draw(int x, int y, int scale, int position); Правила использования виртуальных методов Если в базовом классе метод определен как виртуальный, метод определенный в производном классе с тем же именем и набором параметров автоматически становится виртуальным, а с отличающимся набором параметров – обычным. Виртуальные методы наследуются, то есть переопределять их в производном классе требуется только при необходимости задать отличающиеся действия. Права доступа при переопределении изменить нельзя. Если виртуальный метод переопределен в производном классе объекты этого класса могут получить доступ к методу базового класса с помощью операций доступа к области видимости. Виртуальный метод не может объявляется с модификатором static но может быть объявлен как дружественным. Если в классе, вводится описание виртуального метода он должен, быть определен хотя бы как натуральный (содержать признак =0 вместо тела метода). Virtual void f(init)=0; Чисто виртуальный метод должен переопределяться в производном классе Для каждого класса не объекта содержащего хотябы 1 виртуальный метод, компилятор создает таблицу виртуальных методов(vtbl). Каждый объект содержит скрытое дополнительное поле ссылки (vtpr) На этапе компиляции ссылки на виртуальные методы заменяются на обращения к (vtbl) через (vtpr), а на этапе выполнения в момент обращения к методу его адрес выбирается из таблицы Четкого правила, по которому метод следует делать виртуальным, не существует. Стоит объявлять виртуальными методы, для которых есть вероятность, что они будут переопределены в производных класса. Виртуальный механизм работает только при использовании указателей или ссылок на объекты. Объект, определенный через указатель или ссылку и содержащий виртуальные методы, называется полиморфным. В данном случае полиморфизм состоит в том, что с помощью одного и того же обращения е методу выполняются различные действия в зависимости от типа, на который ссылается указатель в каждый момент времени. Абстрактные классы – класс, содержащий хотя бы один чисто виртуальный метод. Абстрактные классы предназначены для предоставления общих понятий, которые предполагается конкретизировать в производных классах. Абстрактный класс может использоваться только в качестве базового для других классов – объекты абстрактного класса создавать нельзя, поскольку прямой или косвенный вызов чисто виртуального метода приводит к ошибке при выполнении. Определение абстрактного класса: · абстрактный класс нельзя использовать при явном приведении типов, для описания типа параметра и типа возвращаемого функцией значения; · допускается объявлять указатели и ссылки на абстрактный класс, если при инициализации не требуется создавать временный объект; · если класс, производный от абстрактного, не определяет все чисто виртуальные функции, он также является абстрактным. КЛАССЫ
Класс – является абстрактным типом данных. Данные класса называются полями, а функция класса методами. Поля и методы называются элементами класса. Class <имя>{ [private: ] <описание скрытых элементов> Public: <описание доступных элементов> }; Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет. Поля класса: · Могут иметь любой тип, кроме типа этого же класса · Могут быть описаны с модификатором const, при этом они инициализируются только один раз; · Могут быть описаны с модификатором static, но не как auto, extern и register. Особенности локального класса: · Внутри локального класса можно использовать типы, статические (static) и внешние (extern) переменные, внешние функции и элементы перечислений из области, в которой он описан; запрещается использовать автоматические переменные из этой области; · Локальный класс не может иметь статических элементов; · Методы этого класса могут быть описаны только внутри класса; · Если один класс вложен в другой класс, они не имеют каких-либо особых прав доступа к элементам друг друга и могут обращаться к ним только по общим правилам. Класс, моделирующий персонаж компьютерной игры. Class monstr{ Int health,ammo; Public: Monstr(in the = 100, int am=10){health=he; ammo=am;} Void draw(int x,int y, int scale, int position); Int get_health(){return health;} Int get_ammo(){return ammo;} }; Если тело метода определено внутри класса он является встроенным. Если внутри класса записано только объявление метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::): Void monstr::draw(int x,int y, int scale, int position){ /*тело метода*/ } Конкретные переменные типа «класс» называются экземплярами класса, или объектами.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |