550 ________________Часть IV. Новые возможности C++
сует рамку элемента управления, и paint, рисует весь элемент управления:
рамку и все остальное.
Как же мы собираемся наследовать класс TChordGauge от TGauge? Так же, как мы поступали выше в примерах со служащими. Мы просто начнем описание нашего класса следующим образом (_OWLCLASS указывает, что TChordGauge определяется как класс OWL):
class OWLCLASS TChordGauge : public TGauge {
Теперь мы имеем всю структуру и поведение класса TGauge в нашем собственном классе TChordGauge, правильно? Не совсем. Мы пока еще не можем сделать очень важное действие:
TChordGauge *ChordGauge = new TChordGauge(...);
Мы еще не можем сконструировать TChordGauge: в C++ нельзя унаследовать конструктор. Если бы мы хотели продублировать конструктор TGauge в классе TChordGauge, МЫ МОГЛИ бы ПрОСТО ВЫЗВатЬ КОНСТруКТОр TChordGauge С та-
кими же аргументами, какие требует TGauge:
class J3WLCLASS TChordGauge : public TGauge (
TChordGauge(TWindow* parent, const char far* title, int id,
int x, int y, int w, int h = 0, bool isHorizontal = true, int margin = 1, TModule* module = 0):
TGauge(parent, title, id, x, y, w, h, isHorizontal, margin, module) { } );
Здесь мы определили точно такой же конструктор в классе TChordGauge, как и в классе TGauge, а затем передали все аргументы для обработки непосредственно в класс TGauge. Это совершенно законный образ действий, однако мы можем упростить наш конструктор, потому что не будем использовать все аргументы в TChordGauge: у нас не будет заголовка title (хотя он останется доступным для будущих модификаций), isHorizontal к нашему индикатору неприменимо и т. д. А что, если мы захотим добавить к нашему конструктору что-нибудь свойственное только классу TChordGauge? Предположим, например, что наш класс TChordGauge может рисовать деления на дуге индикатора на равном расстоянии друг от друга. Тогда параметр, задающий количество делений (когда он равен нулю, деления рисоваться не будут), назовем его ticks, будет уникален для нашего конструктора. Таким образом мы можем, по сути, настроить наш конструктор так, как нам требуется. Надо только помнить о том, что поскольку новый класс берет практически все, что можно у класса TGauge, то конструктору TGauge нужно передать всю необходимую для конструирования информацию. Вот конструктор в том виде, как он определен в файле Chordg.cpp: