Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП-ГОТОВО.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
173.57 Кб
Скачать

X(); // derived class

Конструкторы не могут быть вирт-ными, в отличие от деструкторов.Практически каждый класс, имеющий вирт. функцию,должен иметь вирт. деструктор. Опред-ние деструктора как вирт-ного позволяет корректно уничтожить объект производного класса по ссылке или указателю типа базового класса.Если базовый деструктор вирт.,то и все производные тоже. Вирт. ф-ции не могут быть статическими. Вирт. ф-ции могут не переопределяться в производных классах. В случае переопределения вирт. ф-ций, кол-во и типы аргументов должны совпадать с определением базовой вирт.ф-ции.

6. Чисто-виртуальные методы и абстрактные классы. Примеры на языке C++.

Абстрактными становятся классы, в которых определена одна или более функций-заглушек - виртуальных функций с оператором присвоения значения 0 в их определении, например:

  virtual void rotate(int) = 0; // чистая виртуальная функция

Чистая виртуальная функция ничего не делает и недоступна для вызовов. Она используется как основа для подменяющих ее функций в производных классах. Абстрактный класс не может порождать объектов и может использоваться только в качестве базового для производных классов. Механизм абстрактных классов разработан для представления общих понятий, которые в дальнейшем предполагается конкретизировать. При этом иерархия классов строится по следующей схеме. Во главе иерархии стоит абстрактный базовый класс(используется для наследования интерфейса). Производные классы будут конкретизировать и реализовать этот интерфейс. В абстрактном классе объявлены чистые виртуальные функции, которые по сути есть абстрактные методы:

class shape {//abstract class point center;

public:

   where() { return center; }

   move(point p) { 

class circle : public shape { int radius;

public:

   void rotate(int) ;

center = p; 

draw(); }

   virtual void rotate(int) = 0; 

   virtual void draw() = 0;   

   virtual void hilite() = 0;   }

   void draw();  

void hilite();}

Формальным параметром функции не может быть объект абстрактного класса, но может быть указатель (или ссылка) на абстрактный класс. Т.е. появляется возможность передавать в вызываемую функцию в качестве фактического параметра значение указателя на производный объект, заменяя им указатель на абстрактный базовый класс. Т.о. получаем полиморфные объекты.

Преимущества использования абстрактных классов:

  • Одно из преимуществ абстрактного метода является то, что можно наделить нужным действием абстракцию сколь угодно высокого уровня. Например, для геометрических фигур мы можем определить метод Draw, который их рисует: треугольник Triangle, окружность Circle, квадрат Square. Мы определим аналогичный метод и для абстрактного родительского класса Shape. Но наличие метода Draw позволяет связать рисование только один раз с классом Shape, а не вводить три независимые концепции для подклассов Triangle, Circle, Square.

  • В ОО языках программирования со статическими типами данных,к которым относится и С++, программист может вызвать метод класса, только если компилятор может определить, что класс действительно имеет такой метод. Напр., необходимо определить полиморфную переменную типа Shape, которая будет в различные моменты времени содержать фигуры различного типа. Но компилятор разрешит исп-ть метод Draw для переменной, только если он сможет гарантировать, что в классе переменной имеется такой метод. Присоединение метода Draw к классу Shape обеспечивает такую гарантию, даже если метод Draw для класса Shape никогда не выполняется. Для того чтобы каждая фигура рисовалась по-своему, метод Draw должен быть виртуальным. Класс Circle является производным от абстрактного класса Shape. Тогда каждая виртуальная функция-заглушка класса Shape, не имеющая переопределения в классе Circle, становится автоматически функцией заглушкой и для класса Circle. Из чего следует, что и класс Circle будет абстрактным.Абстрактный класс в C++ – это конструкция, которая в других ОО языках программирования и в UML фиксируется в таком понятии, как интерфейс. В UML введен стереотип «Interface» для изображения класса.

7. Шаблоны классов: назначение и применение. Примеры на языке С++.

Шаблоны С++ облегчают генерацию семейств функций или классов, оперирующих со множеством различных типов данных, освобождая от необходимости создавать отдельную функцию или класс для каждого типа. Другими словами, шаблоны предоставляют все удобства для написания общего (родового) определения функции или класса, которое компилятор автоматически транслирует в специфическую версию функции или класса для каждого из типов, данных, с которыми программа работает в данный момент.

В определении шаблона может быть задан параметр типа, который обозначает тип переменной или константы, передаваемой через вызов функции. Если программа передает, например, целочисленное значение, то компилятор будет автоматически генерировать версию функции, в которой параметр типа имеет значение int, и это будет вставлено в код, вызывающий данную версию функции.

Шаблоны, в некотором смысле, напоминают макросы, однако они более разнообразны и надежны. Тем не менее, достаточно часто шаблоны реализуются как обычные С-макросы.

Определение шаблона класса имеет вид:

template <список_параметров_типов> class имя_класса { /* тело класса */ }

В шаблон класса можно включить любое количество параметров типа и параметров констант, помещая их в список_параметров_типов. Внутри определения класса можно использовать параметр типа в любом месте кода, в котором допустимо применение спецификации типа, и параметр константы в любом месте, где допустимо применение константного выражения.

Пример определения шаблона класса:

template <class T> class Vector {

T *data;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]