Вызовы статических методов

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

class TFirstComponent: public Tcomponent

{

public:

void _fastcall Move() ;

void _fastcall Flash();

};

class TSecondComponent: public TPirstComponent { public:

void _fasfccall Move(); // отличен от наследованного метода

int _fastcall Flash(int HowOften); // тоже отличается };

Листинг 6.11. Переопределение статических методов.

Адреса статических методов не меняются при наследовании, а значит, статические методы не следует переопределять - они призваны выполнять одинаковые действия во всех родственных компонентных объектах. Листинг 6.11 показывает, что переопределение статических методов в производном классе по сути заменяет родительские методы.

6.5.2 Вызовы виртуальных методов

Вызов виртуального метода записывается точно так же, как вызовы других функций, однако механизм обращения слегка усложняется, делая его более гибким. Поскольку виртуальные методы могут быть переопределены в производных классах, их адреса невозможно определить на стадии компиляции. Фактические адреса виртуальных методов становятся известными только во время выполнения программы.

Ключевое словоvirtual в объявлении метода создает запись в таблице виртуальных методов объекта (VMT). При выполнении программы эти записи преобразуются в фактические адреса всех виртуальных методов данного компонентного класса. Когда вы производите новый объектный класс, он наследует VMT всех своих предшественников, добавляя к таблице дополнительные виртуальные методы, объявленные в производном классе. Кроме того, производный класс может переопределять наследованные виртуальные методы. Любой конструктор компоненты всегда должен быть виртуальным.

6.6 Иерархия классов VCL

Ранее в этой главе мы ознакомились с характеристиками четырех базисных типов компонент: стандартные, оригинальные, графические и невидимые. Теперь покажем место и назначение этих типов в иерархии объектов.

Рис. 6.7 показывает ключевые классы в иерархической структуре, от которых произведены все компоненты VCL. Каждый объект представляет некоторый набор методов, событий и свойств и имеет специальное назначение.

TObiect

TPersistent

TComponent

TControl

TGraphicControl TWinControl

TCustomControl

Рис. 6.7. Иерархия ключевых базовых классов VCL.

Подобно тому как TObject является базовым классом для всех порождаемых классов, TComponent является базовым классом для всех порождаемых компонент. $

Невидимые компоненты произведены от класса TComponent. Графические компоненты, не ассоциированные с оконными элементами управления, произведены от класса TGraphicControl.

Являясь оконными элементами, компоненты стандартного управления произведены непосредственно от класса TWinControl, а оригинальные компоненты — косвенно от класса TCustomControl, восходящего к TWinControl. Именно на уровне TWinControl и вводится "оконный дескриптор" (window handle). Рис. 6.8 S продолжает иерархическую структурную схему компонентных классов VCL.

* TButtonControl

о TButton

+ TBitBtn о TCustomCheckBox

+ TCheckBox

+ TDBCheckBox о TRadioButton

* TCustomComboBox о TComboBox о TDBComboBox о TDriveComboBox о TFilterComboBox

* TCustoinControl

о TCustomGrid

+ TCustomDBGrid + TDBGrid + TDBLookupList

+ TPopupGrid + TCustomOutline

+ TOutline + TDrawGrid

+ TStringGrid о TCustomGroupBox

+ TCustomRadioGroup + TDBRadioGroup + TRadioGroup

+ TGroupBox о TCustomPanei

+ TDBNavigator

+ TPanel о TDBImage о TDBLookupControl

+ TDBLookupComboBox

+ TDBLookupListBox

+ TPopupDataList о THeader о THintWindow о TMediaPlayer о TNotebook о TOleContainer о TPage о TScroller о TTabSet

* TCuatonEdit

о TCustomMaskEdit

+ TDBEdit

+ TInplaceEdit

+ TMaskEdit о TCustomMemo

+ TCustomRichEdit + TRichEdit

+ TDBMemo

+ TMemo о TDBLookupCombo о TEdit

* TCustomHotKey о THotKey

* TCuafcomListBox о TDBListBox о TDirectoryListBox о TFileListBox о TListBox

* TCuetomLietView о TListView

* TCuetomTabControl о TPageControl о TTabbedNotebook о TTabControl

* TCustomTreeView о TTreeView

* TCustomUpDown 0 TUpDown

* TDBCtrlGrid

* TDBCtrlPanel

* THeaderControl

* TOleControl

* TProgressBar

* TScrollBar

* TScrollingWinControl

о TForm

+ TDesignWindow + TInputReqDialog + TLoginDialog + TPasswordDialog

о TScrollBox

* TStatueBar

* TTabPage

* TTabSheet

* TTrackBar