Глава 20. Наследование и полиморфизм___________________________557

рактньш классом (abstract class), и, фактически, образование экземпляров абстрактного класса ,не разрешается. Так что вы не смогли бы сделать следующее:

TChordGaugePart myPart; // Это ошибка.

Абстрактные классы служат исключительно как базовые для других классов. Они очень полезны для определения интерфейсов в основании цепи производных классов.

Таким образом, имея наш абстрактный базовый класс, TChordGaugePart, мы могли бы затем объявить два производных класса, TChordGaugeBorderPart и

TChordGaugeFacePart, следующим образом:

class TChordGaugeBorderPart : public TChordGaugePart

{

public:

TChordGaugeBorderPart() ;

void DrawPart(TDC Sdc) ;

};

class TChordGaugeFacePart : public TChordGaugePart

{

public:

TChordGaugeFacePart() ;

void DrawPart(TDC Sdc);

};

Как говорилось раньше, действительная реализация DrawPart в каждом случае соответствовала бы коду paint и paintBorder в исходном файле Chordg.cpp, но с одним исключением. Догадываетесь, что это? Что вы думаете о некоторых переменных, используемых функциями PaintBorder и paint — Мах, Min, value, ticks — откуда они берутся? Их, конечно, берут или из класса TChordGauge, или из класса TGauge; однако наши классы, произошедшие от TChordGaugePart, не имеют доступа к этим переменным. Чтобы получить к ним доступ в классах необходимо использовать такие функции-члены, как GetRange И GetValue (из класса TGauge) И GetTicks (ИЗ Класса

TChordGauge). Нам потребуется сделать одно небольшое изменение в трех только что разработанных классах; в них нужно включить элемент данных, который хранил бы указатель на TChordGauge, которому они принадлежат (называющийся, например, parent), через который вызывались бы эти функции доступа.

Замечание

¦Вы можете спросить себя, почему мы не можем создать дружеские (friend) Отношения между классами TChordGauge И TChordGaugePart так, чтобы получить доступ к этим переменным. К сожалению, дружба в C++ не