BeOS - статьи


Классы и объекты, отступление первое - часть 5


Суть дела тут вот в чем, применительно к проблемам 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); }

Ну вот, просто, но уже действенно - при нажатии на кнопку мыши в нашем окне будет рисоваться линия к месту щелчка.


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