Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 25

Синтаксис объявления:

virtual тип_возвращаемого_значения имя_функции (список_передаваемых_параметров)=0 , где "=0" - означает, что объявлена чистая виртуальная функция.

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

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

Нами рассмотрены основные методы реализации идей ООП в С++. Они основаны на введении нового типа данных - класса и новых методов манипулирования с объектами класса.

Так как класс - это новый тип данных, то с объектами класса возможны и привычные манипуляции, выполняемые над данными, как, например:

определение массива объектов, указателей на объект, передача объектов в качестве параметров функции, и т.п.

Так, если объявить класс:

          Class My_ob { .....}, то возможны следующие действия:

          void F1(My_ob p) {....} //передача объекта функции;

          My_ob Mas[10]; //объявление массива из 10 объектов;

          My_ob a,*b;

          b=&a; // b - является указателем на объект а,

тогда обращение к его компонентам можно осуществлять с помощью знака ->. Если К - компонент объекта а, то после инициализации b=&a; , к нему можно обратиться следующим образом: b->К.

Если объявить: My_ob mas[10],*p;

и присвоить: p=&mas[0]; , то (p+1) является указателем на следующий элемент mas[1], т.е. выполняется смещение указателя на размер объекта.

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

 #include <iostream.h>

class My

 { int i;

          public:

          My() { i = 0; } // это конструктор

          void put_i(void) { cout << "i = " << i << "\n"; }        //метод вывода значения i

          void set_i(int Y) { i = Y; }};                  //метод инициализации значения i

          void function(My x)         // функции function передается объект x типа My

          { My *y;                           //y - указатель на объект типа My

          y = &x;                            // теперь y - указатель на объект x типа My

          x.put_i();                         // обращение к объекту по имени

          y->put_i();};                     // обращение к объекту через указатель

          void main(void)

          { My mas[4],*p;                         // объявление массива mas из четырех

          // объектов и указателя p на объект типа My

          mas[0].set_i(20);                       // присвоение значений компоненту i

          mas[1].set_i(50);                       // объектов mas[0], mas[1] и mas[2]

          mas[2].set_i(100);

          p = &mas[1];                             // p устанавливается на адрес объекта mas[1]

          p->put_i();                       // вызов функции, вывод значения 50

          (p+1)->put_i();                           // вывод значения 100

          (p-1)->put_i();                            // вывод значения 20

          function(mas[1]);            // вызов функции и передача ей объекта

                    // mas[1] в качестве параметра (выведутся значения 50 и 50)

          function(mas[3]); }          // вызов функции и передача ей объекта

                              // mas[3] в качестве параметра (выведутся значения 0 и 0)

          Результаты выполнения программы:

          i=50

          i=100

          1=20

          i=50

          i=50

          i=0