Referat.me

Название: Добавление к Классу

Вид работы: статья

Рубрика: Информатика и программирование

Размер файла: 13.81 Kb

Скачать файл: referat.me-139021.docx

Краткое описание работы: Для производного класса можно определить данные и функции дополнительно к тем, которые наследуются из его базового класса. Это дает альтернативную стратегию обеспечить средства связанного списка.

Добавление к Классу

В предыдущих примерах производный класс ничего не добавлял к базовому классу. Для производного класса функции определялись только чтобы обеспечить преобразование типа. Каждый производный класс просто задавал альтернативный интерфейс к общему множеству программ. Этот специальный случай важен, но наиболее обычная причина определения новых классов как производных классов в том, что кто-то хочет иметь то, что предоставляет базовый класс, плюс еще чуть-чуть.

Для производного класса можно определить данные и функции дополнительно к тем, которые наследуются из его базового класса. Это дает альтернативную стратегию обеспечить средства связанного списка. Заметьте, когда в тот slist, который определялся выше, помещается элемент, то создается slink, содержащий два указателя. На их создание тратится время, а ведь без одного из указателей можно обойтись, при условии, что нужно только чтобы объект мог находиться в одном списке. Так что указатель next на следующий можно поместить в сам объект, вместо того, чтобы помещать его в отдельный объект slink. Идея состоит в том, чтобы создать класс olink с единственным полем next, и класс olist, который может обрабатывать указателями на такие звенья olink. Тогда olist сможет манипулировать объектами любого класса, производного от olink. Буква "o" в названиях стоит для того, чтобы напоминать вам, что объект может находиться одновременно только в одном списке olist:

struct olink {

olink* next;

};

Класс olist очень напоминает класс slist. Отличие состоит в том, что пользователь класса olist манипулирует объектами класса olink непосредственно:

class olist {

olink* last;

public:

void insert(olink* p);

void append(olink* p);

olink* get();

// ...

};

Мы можем вывести из класса olink класс name:

class name : public olink {

// ...

};

Теперь легко сделать список, который можно использовать без накладных расходов времени на размещение или памяти.

Объекты, помещаемы в olist, теряют свой тип. Это означает, что компилятор знает только то, что они olink"и. Правильный тип можно восстановить с помощью явного преобразования типа объектов, вынутых из olist.

Например:

void f()

{

olist ll;

name nn;

ll.insert(&nn); // тип &nn потерян

name* pn = (name*)ll.get(); // и восстановлен

}

Другой способ: тип можно восстановить, выведя еще один класс из olist для обработки преобразования типа:

class olist : public olist {

// ...

name* get() { return (name*)olist::get(); }

};

Имя name может одновременно находиться только в одном olist. Для имен это может быть и не подходит, но в классах, для которых это подойдет полностью, недостатка нет. Например, класс фигур shape использует для поддержки списка всех фигур именно этот метод. Обратите внимание, что можно было бы определить slist как производный от olist, объединяя таким образом оба понятия. Однако использование базовых и производных классов на таком микроскопическом уровне может очень сильно исказить код.

Похожие работы

  • Запись и считывание данных (работа с файлами)

    В этой работе будут рассмотрены два способа работы с файлами и стандартный класс MFC CFileDialog.

  • Альтернативные Интерфейсы

    Интерфейс. Реализация. Как Этим Пользоваться. Обработка Ошибок. Обобщенные Классы. Ограниченные Интерфейсы.

  • Свободная Память

    Если вы пользовались классом slist, вы могли обнаружить, что ваша программа тратит на заметное время на размещение и освобождение объектов класса slink.

  • Производные Классы

    Построение Производного Класса . Функции Члены. Видимость. Указатели. Иерархия Типов. Конструкторы и Деструкторы. Поля Типа. Виртуальные Функции.

  • Полиморфные Вектора

    У вас есть другая возможность - определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса.

  • Объективное программирование

    ВВЕДЕНИЕ В ОБЪЕКТНОЕ ПРОГРАММИРОВАНИЕ Лекция 1. Объектное программирование как технология программирования -------------------------------------------------------------

  • Интерфейсы как решение проблем множественного наследования

    В этой работе разбирается проблема множественного наследования в языке программирования С++ и возможное ее решение путем применения абстракций интерфейсов.

  • Агрегация или наследование?

    И снова о проектировании классов. Больная тема и место применения множества трюков. Большинство программистов используют трюки по-разному. Видимо, есть три способа их применения.

  • Построение компоненты в Builder C++

    Разработка компоненты C++ Builder, состоящей из двух окружностей, одна из которых движется по периметру другой. Создание установочного пакета и тестового приложения с использованием разработанного компонента. Инсталляция и проверка готовой компоненты.

  • Основы программирования в C++

    История развития языков программирования; создание и распространение языка С++; новый подход к разработке объектно-ориентированного программного обеспечения. Применение моделирования предметных областей для структуризации их информационных отражений.