Перегружаемые функции и операторы (overload)

Страницы работы

Фрагмент текста работы

точки должны содержать позиции, можно сделать класс 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 и т.д. Вы даже можете иметь класс, порожденный из более, чем одного базового класса: это называется многократным наследованием. Большая часть разработки С++ прикладных программ заключается в построении этой классовой иерархии и выражении генеалогического дерева классов в этих программах.

3. Полиморфизм. Раннее и позднее связывание

Инкапсуляция и наследование - это две из трех основных характеристик, благодаря которым ООП является столь мощным методом. Третья характеристика - полиморфизм, который в сочетании с поздним связыванием представляет весьма продуктивную, но и весьма сложную идею.

На первом этапе рассмотрения этой идеи для нас будет важно понять не только пути ее реализации, а увидеть существование самой проблемы.

Прежде чем приступить к этому, продолжим рассмотрение нашего примера.

Классы, такие как 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.

Запишем определения для всех функций элементов этих двух классов:

Похожие материалы

Информация о работе