Если перед объявлением любой функции
Суть дела тут вот в чем, применительно к проблемам BeOS-программирования. Если перед объявлением любой функции класса стоит слово virtual,
например:
class KrutojeOkno : public BWindow { .... virtual int KnopkaNazhata(); ... }
и как-то в этом классе эта функция реализована, что-то делает (или не делает), то, в другом классе, сделанном на основе старого (да-да, теперь мы и наш первый класс может использовать как кубик для построения новых ), можно объявить функцию с точно таким же названием, как в родительском классе:
class PrjamojeOkno : public KrutojeOkno { ....
virtual int KnopkaNazhata(); ... }
при этом с совершенно другим кодом.
Если бы мы так не сделали, то вызов PrjamojeOkno->KnopkaNazhata(); на самом деле бы запускал старую функцию, из класса KrutojeOkno, по праву наследования.
Хм, что, уважаемому читателю пока не очень понятно, зачем эта муть? Не проще ли было просто создать функцию с другим именем, безо всякой виртуальной мистики и дело с концом? Ну что ж, возьмем более жизненный пример.
В стандартном "системном" классе есть виртуальная функция MouseDown(int x, int y).
Причем в этом самом классе - она пустая, по сути - заготовка.
virtual void MouseDown(int x, int y) { }
то есть не делает ничего, НО! - эта функция автоматически вызывается, когда пользователь щелкнул мышкой в окне. Причем вызывается с "правильными" параметрами - местом, где щелкнули.
Грех не использовать такую простую, но ценную штуку в собственном классе - а как же еще мы может поймать мышиный щелчок в нашей программе? Но при этом мы можем снабдить ее осмысленным кодом:
(отрывок заголовочного файла - здесь мы объявляем, что у нас будет своя версия этой функции)
class VidVOkne : public BView { ... virtual void MouseDown(int x, int y, int buttons); ... } ---------------------- (файл с кодом - здесь мы расписываем,
что наша версия делает) virtual void VidVOkne :: MouseDown(int x, int y) { DrawLine(x, y); }
Ну вот, просто, но уже действенно - при нажатии на кнопку мыши в нашем окне будет рисоваться линия к месту щелчка.
Содержание Назад Вперед