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


Назад: Си++ = Си + классы + объектно-ориентированное - часть 3


Проиллюстрируем сказанное средствами "классического" Си:


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


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]))();


}






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




Начало  Назад  Вперед