Основы языка
© 2000-2011, MetaQuotes Software Corp.
184
Виртуальные функции
Ключевое слово virtual служит спецификатором функции, который обеспечивает механизм для
динамического выбора на этапе выполнения подходящей функции-члена среди функций базового
и производного классов, структуры не могут иметь виртуальных функций. Оно может применяться
для изменения объявлений только функций-членов.
Виртуальная функция, как и обычная функция, должна иметь исполняемоетело. При вызове
семантика ее точно такая же, как и у остальных функций.
Виртуальная функция может замещаться в производном классе. Выбор того, какое
определениефункции вызвать для виртуальной функции, происходит динамически (на этапе
выполнения). Типичный случай – когда базовый класс содержит виртуальную функцию, а
производные классы имеют свои версии этой функции.
Указатель на базовый класс может указывать либо на объект базового класса, либо на объект
производного класса. Выбор вызываемой функции-члена будет произведен на этапе выполнения и
будет зависеть от типа объекта, а не от типа указателя. При отсутствии члена производного типа
по умолчанию используется виртуальная функция базового класса.
Деструкторы всегда являются виртуальными, независимо от того, объявлены они с ключевым
слово virtual или нет.
Рассмотрим использование виртуальных функций на примере программы MT5_Tetris.mq5. Во
включаемом файле MT5_TetisShape.mqh определен базовый класс CTetrisShape с виртуальной
функцией Draw (рисовать).
//+------------------------------------------------------------------+
class CTetrisShape
{
protected:
int m_type;
int m_xpos;
int m_ypos;
int m_xsize;
int m_ysize;
int m_prev_turn;
int m_turn;
int m_right_border;
public:
void CTetrisShape();
void SetRightBorder(int border) { m_right_border=border; }
void SetYPos(int ypos) { m_ypos=ypos; }
void SetXPos(int xpos) { m_xpos=xpos; }
int GetYPos() { return(m_ypos); }
int GetXPos() { return(m_xpos); }
int GetYSize() { return(m_ysize); }
int GetXSize() { return(m_xsize); }
int GetType() { return(m_type); }
void Left() { m_xpos-=SHAPE_SIZE; }
void Right() { m_xpos+=SHAPE_SIZE; }