Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итоговый конспект Тельнов.docx
Скачиваний:
10
Добавлен:
07.04.2023
Размер:
7.75 Mб
Скачать

33. Абстрактные классы. Их назначение, пример.

Абстрактные классы используются для порождения производных классов. «Нет ничего практичнее хорошей абстракции» (перефразируя Р.Кирхгофа). Переопределим абстрактную фигуру ещё раз следующим образом:

class TFigure : public TLocation { //абстрактная фигура

protected:

bool Vision; //признак видимости фигуры на экране

public:

TFigure(int, int); //конструктор

virtual ~TFigure(); //виртуальный деструктор

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

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

bool IsVisible(); //получение признака видимости

void MoveTo(int, int); }; //перемещение фигуры по экрану

Класс называется абстрактным, если он содержит хотя бы одну чистую виртуальную функцию. Создание объектов абстрактных классов бессмысленно, т.к. такие объекты будут нежизнеспособны. Чистые виртуальные функции должны быть перекрыты в классах-потомках в обязательном порядке.

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

34. Полиморфный контейнер (пример).

Пример полиморфного Контейнера

Cstr

CColymorph

Cint

Cpoint

#include <list>

#Include <iostream>

Using namespace std;

class CPolymorph;//абстрактный класс

{

Public:

Virtual CPolymorph& get()=0;//Чистая виртуальная функция;

};

Class CStr : public CPolymorph

{

Char *S

Public:

CStr(char* s =”xyz”){S = new char[strlen(s)+1];strcpy(S,s);}

Cstr& get(){cout << “Object Cstr: ”<< S << endl; return *this;}

};

Class CPoint: public CPolymorph

{

Int X,Y;

Public:

CPoint(int x = 0, int y = 0){X = x; Y = y;}

CPoint& get(){cout << “Object CPoint: ” << “X = ”<<X<<”Y = ”<<Y<<endl; return *this;} }

Int main()

{ Cint n; Cstr m; CPoint k;

List<CPolimorph*> c;

c.pushfront(&n);

c.pushfront(&m);

c.pushfront(&k);

for(list<CPolymorph>::iterator it = c.begin(); it != c.end(); ++c) *c->get(); return 0;}

35.Виртуальная схема наследования.

Виртуальная схема наследования позволяет избегать неоднозначности в процессе множественного наследования.

Это достигается за счёт применения механизма позднего связывания и использования ссылочных типов.

При этом, вся внутренняя работа выполняется компилятором и конструкторами объектов. Разработчику кода необходимо лишь указать ключевое слово “virtual” при описании процесса наследования.

Пример. Пусть есть такие описания:

// Вариант 1 – используем обычную схему множественного наследования

class Base { ….. };

class Derived : public Base, public Base { ….. }; // так нельзя (синтаксис!)

class X : public Base { ….. };

class Y : public Base { ….. };

class Derived : X, Y { ….. }; // так можно, в Derived попадёт две копии Base

// Вариант 2 – используем виртуальную схему множественного наследования

class X : virtual public Base { ….. };

class Y : virtual public Base { ….. };

class Derived : X, Y { ….. }; // так можно, причём в Derived

// избежим неоднозначности с Base