Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_ROD_1.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

Чисто абстрактные базовые классы

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

В начале объявления чисто виртуальной функции ставится спецификатор virtual, а за функцией следует присваивание нуля =0 (это знак спецификатора чистоты - pure specifier). Реализация чисто виртуальных функций выполняется в классах, наследующих абстрактный базовый класс. При попытке создать объект абстрактного класса, компилятор предотвращает операцию создания.

Пример.

// Чисто абстрактные базовые классы - интерфейсы

class IType_1 { public: virtual void __stdcall operT1(int, int, int*) = 0; };

class IType_2 { public: virtual void __stdcall operT2(int, int, int*) = 0; };

Любой компилятор, поддерживающий разработку для Win32, поддерживает и это ключевое слово __stdcall. Функция, помеченная как __stdcall, использует соглашение о вызове языка Pascal. Такая функция выбирает параметры из стека перед возвратом в вызывающую процедуру. В соответствии же с обычным соглашением о вызове С/С++ стек очищает вызывающая процедура, а не вызываемая.

Множественное наследование классов. Компоненты

Реализация чисто абстрактных базовых классов выполняется классом объектов-компонентов, наследующим базовые классы:

// Класс объектов (компонентов), реализующих интерфейсы

c lass COMP : public IType_1, public IType_2 {

public:

// Реализация интерфейса IType_1

virtual void __stdcall operT1(int a, int b, int* pr) {

*pr = a + b;

}

// Реализация интерфейса IType_2

virtual void __stdcall operT2(int c, int d, int* ps) {

*ps = c * d;

}

};

При множественном наследовании, одновременно наследуются два и более базовых класса. Функцией main создает и поддерживает жизненный цикл компонента, реализованного классом COMP. Она представляет также клиент компонента COMP, реализующий алгоритм, изображенный на рис.2.

void main() { //Клиент

int a=1, b=2, c=3, q, r, u, v, w, x, y, z;

COMP* pC = new COMP;

// Получить указатель IType_1

IType_1* pIType_1 = pC;

// Получить указатель IType_2

IType_2* pIType_2 = pC;

pIType_1->operT1(b,c,&u);

pIType_2->operT2(a,u,&v);

pIType_1->operT1(a,c,&w);

pIType_2->operT2(b,w,&r);

pIType_1->operT1(v,r,&x);

pIType_1->operT1(a,b,&z);

pIType_2->operT2(c,z,&q);

pIType_1->operT1(x,q,&y);

delete pC;

}

Приведенный пример реализации клиента и сервера на С++ дает лишь начальное представление о компонентах. Он пока не удовлетворяет всем требованиям модели COM.

Задача - Привести пример плана, построенного в соответствии со стратегией ALAP.

Тип – планирование на достижимость.

Исходные данные: 1) Граф непосредственного предшествования операций.

Результирующие данные:

  1. Шаги управления.

  2. Распределение операций по шагам управления

  3. Число процессоров каждого типа.

Описание алгоритма:

  1. Планирование выполняется в цикле, начиная с последнего шага и кончая первым шагом.

  2. Алгоритм начинает работу с введения последнего шага управления и размещения на нем операций, не имеющих операций-последователей.

  3. Алгоритм завершает работу в случае назначения всех операций на шаги управления.

  4. Для каждого шага управления выполняются следующие действия по планированию:

    1. Из множества всех операций выбираются не спланированные операции.

    2. Для каждой из них проверяется, все ли операции-последователи спланированы на последующих шагах управления.

    3. Если да, то операция включается в текущий шаг, в противном случае остается не спланированной.

Граф по которому планируем:

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