Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ООП.doc
Скачиваний:
31
Добавлен:
25.09.2019
Размер:
1.04 Mб
Скачать
  1. Множественное наследование в классе, порождённом от нескольких родительских классов-предков.

Множественное наследование

Основная статья: Множественное наследование

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживает возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

  1. Производные классы: полиморфная функция

Полиморфные функции

Используя производные классы, можно определить интерфейс, предоставляющий унифицированный доступ к объектам неизвестных и/или различных классов. Это может быть использовано для написания полиморфных функций, т.е. таких функций, в которых

алгоритм специфицирован таким образом, что может быть применен к аргументам различных типов. Например:

void sort(common *v[], int size)

{

/* сортировка массива элементов типа

common "v[size]" */

}

Функции s o r t необходимо лишь иметь возможность сравнивать объекты класса c o m m o n для выполнения своей задачи. Таким образом, если класс c o m m o n имеет виртуальную функцию c m p r ( ) , s o r t ( ) будет иметь возможность сортировать массив объектов любого класса, производного от класса c o m m o n , для которого c m p r ( ) определена. Например:

class common {

...

virtual int cmpr(common *);

};

class apple : public common {

...

int key;

int cmpr(common *arg)

{

/* предполагается, что arg также имеет тип apple */

return (key == k) ? 0 : (key

};

class orange : public common {

...

int cmpr(common *);

};

Былаа выбрана функция c m p r ( ) , не более привлекательная на первый взгляд перегрузка операцииа " тремя исходами. Для того, чтобы написать функцию s o r t ( ) для

обработки массива объектов класса c o m m o n , а не массива указателей на объекты класса c o m m o n , потребуется виртуальная функция s i z e ( ) (вычисление размера).

Если желательно сравнивать между собой классы a p p l e и o r a n g e , для функции сравнения потребуется некоторый способ получения ключа сортировки. Класс c o m m o n мог бы, например, содержать виртуальную функцию извлечения ключа сортировки.