Информатика и технология программирования


           

В простейшем случае это реализуется


В простейшем случае это реализуется через массив указателей на функции. Для каждой пары производный класс -базовый класс транслятором генерируется свой массив указателей, каждой виртуальной функции соответствует в нем свое значение индекса. Указатель на массив (начальный адрес) записывается в объект базового класса в момент конструирования объекта производного класса. Проиллюстрируем сказанное средствами "классического" Си:

// Компоненты, создаваемые транслятором, обозначены " * **"

class A
{
void (**ftable)(); //* ** Указатель на массив

public: // указателей виртуальных функций

virtual void x();
virtual void y();
virtual void z();
A();
~A();
};
&#35define vx 0 //* ** Индексы в массиве

&#35define vy 1 //* ** указателей на

&#35define vz 2 //* ** виртуальные функции

// Массив адресов функций класса А

void (*TableA[])() = { A::x, A::y, A::z }; //***

A::A()
{ ftable = TableA; //* ** Установка массива для класса А

}

class B : public A
{
public:
void x();
void z();
B();
~B();
};

// Массив адресов функций класса A в B

// A::y - наследуется из А, B::x - переопределяется в B

void (*TableB[])() = { B::x, A::y, B::z }; //***

B::B()
{ A::ftable = TableB; // *** Установка таблицы для класса B

}
void main()
{
A* p; // Указатель p базового класса A

B nnn; // ссылается на объект производного класса B

p = &#38nnn;
p-&#62z(); // *** реализация - (*(p-&#62ftable[vz]))();

}





Виртуальной может быть не только обычная функция-элемент, но и переопределяемая операция.

Если базовый класс используется только для порождения производных классов, то виртуальные функции в базовом классе могут быть "пустыми", поскольку никогда не будут вызваны для объекта базового класса. Базовый класс в котором есть хотя бы одна такая функция, называется АБСТРАКТНЫМ. Виртуальные функции в определении класса обозначаются следующим образом:

class base
{
public:
virtual print()=0;
virtual get() =0;
};

Определять тела этих функций не требуется.


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий