точки должны содержать позиции, можно сделать класс Point порожденным от более фундаментального класса - Location, который содержит информацию о координатах x и y. Point наследует все, что имеет Location и добавляет все, что является новым для Point, создавая Point таким, каким он должен быть. Эти два связанных класса могут определяться таким путем:
// point.h содержит два класса:
// класс Location определяет экранную позицию в координатах X
// и Y, класс Point определяет, будет ли точка видимой или нет
enum Boolean {false, true};
class Location {
protected: // разрешает порожденному классу доступ
int X; // к private данным
int Y;
public: // эти функции могут быть доступны извне
Location(int InitX, int InitY); // прототип конструктора
int GetX();
int GetY();
};
class Point : public Location { //порожден из класса Location
// порождение public означает, что X и Y защищены внутри Point
protected:
Boolean Visible; // классам, порожденным от Point, может
// понадобиться доступ
public:
Point(int InitX, int InitY); // прототип конструктора
void Show();
void Hide();
Boolean IsVisible();
void MoveTo(int NewX, int NewY);
};
В данном случае Location - это базовый класс, а Point - это порожденный класс. Процесс может продолжаться неопределенно долго: Вы можете определить другие классы, порожденные из Location, другие классы, порожденные из Point, еще больше классов, порожденных из классов, порожденных из Point и т.д. Вы даже можете иметь класс, порожденный из более, чем одного базового класса: это называется многократным наследованием. Большая часть разработки С++ прикладных программ заключается в построении этой классовой иерархии и выражении генеалогического дерева классов в этих программах.
Инкапсуляция и наследование - это две из трех основных характеристик, благодаря которым ООП является столь мощным методом. Третья характеристика - полиморфизм, который в сочетании с поздним связыванием представляет весьма продуктивную, но и весьма сложную идею.
На первом этапе рассмотрения этой идеи для нас будет важно понять не только пути ее реализации, а увидеть существование самой проблемы.
Прежде чем приступить к этому, продолжим рассмотрение нашего примера.
Классы, такие как Location и Point, могут вместе упаковываться для использования в дальнейшей разработке программ. Со своими встроенными данными, функциями элементов и управлением доступа, класс по существу является модулем. При разработке программы часто имеет смысл поместить объявления для каждого класса или группы соответствующих классов в отдельном файле заголовков, а определения для невстроенных функций элементов в отдельном исходном файле.
Вы также можете комбинировать несколько классовых объектных файлов в библиотеку, используя TLIB.
Есть еще преимущества в модульном представлении классов; Вы можете распределить Ваши классы в объектной форме для других программистов. Другие программисты могут порождать новые, специализированные классы из классов, которые Вы разработали, не имея и не требуя доступа к Вашей исходной программе. Вы можете теперь разработать отдельно компилируемый модуль, содержащий классы Location и Point. Объявления для двух классов (включая их функции элементов), определенные ранее, помещаются в файл point.h.
Снова обратите внимание на то, как класс Point порождается из класса Location:
class Point : public Location { ...
Ключевое слово public требуется перед Location для обеспечения того, чтобы функции элементов порожденного класса Point могли иметь доступ к protected элементам X и Y в базовом классе Location. В дополнение к элементам позиции X и Y, Point наследует функции элементов GetX и GetY из Location. Класс Point также добавляет protected элемент данных Visible (перечисляемого типа Boolean) и пять функций элементов типа public, включая конструктор Point::Point. Заметьте снова, что мы использовали protected, а не доступ private для определенных элементов, так чтобы point.h мог быть использован в более поздних примерах, которые будут использовать новые классы, порожденные из Location и Point.
Запишем определения для всех функций элементов этих двух классов:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.