Глава 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++ не