Параллельное программирование: Учебное пособие, страница 55

3.1.3  Наследование свойств классов

В заключение краткого обзора языка C++ отметим и присущее ему наследование свойств ранее определенных классов. Зависимость между классами в C обеспечивается включением класса или структуры в качестве элемента другого класса (has-a – он есть а). В C++, чтобы создать переменную зависимость между классами, для этих целей используется механизм наследования (is-a- есть а). Если класс D наследует свойства класса B, то все общие члены B становятся также и членами класса D. В свою очередь D включает не только общие члены B, но может также включать и дополнительные члены, определяемые в производном классе обычным способом. Таким образом, D является одной из возможных версий класса B. При описании производного класса после его имени ставится двоеточие, после которого должен следовать список базовых классов.

Текст 3.2. – Определение производного класса D

class B                   //B является базовым классом

{

public:

void base_func1();    //Функции-члены, которые наследу-

void func2();         //ются классами производными от В

};

class D: public B     //D - класс, выводимый из B

{

public:

void func2();         //Переопределение func2 для D

};

void test()

{

B b;                   // Создание образца класса В

D d;                   // Создание образца класса D

d.base_func1();        //Вызов base_func1 и func2,

b.func2();             //определенных в классе В, и функ-

d.func2();             // ции func2, определенной в D.

}

Фрагменты программного текста 3.2 иллюстрируют механизм наследования в C++. В нем свойства общих функций-членов base_func1 и func2, определенных в классе В, передаются общим функциям-членам, определенным в новом классе.

Иногда может потребоваться, чтобы базовый класс вызывал функции, которые определены в других версиях базового класса. Такое свойство поддерживается C++. Такие функции класса называются виртуальными. Они позволяют создавать универсальный базовый класс для специализированных прикладных программ, в которых виртуальные функции могут представлять библиотеку функций многократного использования, например, библиотеку функций для параллельной обработки процессов.

3.2  Введение в CC++

Язык CC++ – универсальный язык параллельного программирования. В его состав включен весь C++, дополненный шестью новыми разделами, которые позволяют описывать взаимодействия параллельно протекающих процессов в многомашинных вычислительных системах. Язык СС++ является строгим надмножеством языка C++. Любая программа, написанная на C или C++, не использующая ключевые слова CC++, будет корректна и как программа, написанная на CC++. К шести новым абстрактным понятиям относятся следующие [15]:

Процессорный объект (processor object) – объект, который реализует механизм управления местоположением. Вычислительная задача может использовать один или несколько процессорных объектов. В пределах одного процессорного объекта последовательный код программы написанной на C++ может выполняться без изменения и, в частности, может обращаться к своим, локальным структурам данных. Ключевое слово global идентифицирует класс процессорного объекта, а предопределение класса ключевым словом proc_t управляет размещением процессорного объекта на конкретном вычислителе (узле многопроцессорной вычислительной системы).

Глобальный указатель (global pointer) – идентификатор с модификатором типа global, который наделен механизмом связывания процессорных объектов друг с другом. Глобальный указатель используется для обращения к структурам данных другого процессорного объекта или для выполнения вычислений на другом процессорном объекте (Remote Procedure Call – RPC – удаленный вызов процедуры)

Поток, процесс, нить(thread) – средство, реализующее механизм параллельного запуска определенных вычислительных процессов, созданных независимо от процессорных объектов. На одном процессорном объекте может выполняться и более одного процесса. Операторами, определяющими процессы в текстах программах, являются  par, parfor и spawn.