Войти

Показать полную графическую версию : Нужно ли множественное наследование?


Crew
23-02-2003, 01:08
На нашем пути существуют следующие проблемы:
Проблема неоднозначности
Например: оба родителя используют метод add(int)
А родители у нас А и В
И предположим, что получившийся класс использует оба метода и ему они нужны для разных целей. После некоторго размышления оставляем оба метода например так
void С::add(int n)
{
* A::add(n);
}
И вводим второй метод
void С::add2(int n)
{
*В::add(n);
}
Ура, проблема решена
А если двусмысленность более сложна?
Сейчас это было необходимо из-за пересечения понятий наследования и параметрической перегрузки. Когда в С++ используется перегруженное имя, то сперва вызывается механизм наследования для поиска контекста, в котором определена функция. Затем типы параметров анализируются для снятия двусмысленности в пределах данного контекста. Предположим, что есть два класса А и В, для каждого из которых определен метод display. но у методов разные аргументы (int и double). Мы считаем, что так как эти два метода различаются по списку параметров, дочерний класс может наследовать от двух родителей и иметь доступ к обоим методам. Счазззз. Когда мы вызываем метод display с целочисленным аргументом, компилятор не может приянять решение, использовать ли функцию из класса A(которая соответствует типу аргумента) или же из класса В (которая встречается первой при заложенном в С++ алгоритме поиска; для ее вызова аргумент будет приведен от типа int к типу double). Копмилятор ругнется, но ругнется только в точке вызова метода, а не при описании класса.
Звучит может угрожающе, но на самом деле это лечится, но только переопределением родительских классов, где методы необходимо объявить виртуальными (не чисто виртуальными), и компилятору станет ясно, что мы сделали это специально
Проблема на уровне дочерних классов, а решение на уровне родительских. Кде тут ООП?
Мне кажется цена использования множественного наследования слишком высокая, но может по неопытности...

Кто реально пользовался множественным наследованием и получил приятные результаты (не ходил и не плевался после применения)?

Это сообщение я уже постил, но на него никто не ответил

vasketsov
23-02-2003, 09:12
Crew
Метод Add видимо несет некую "добавляющую" логику.
В случае одного класса она понятна, но когда в один класс добавляются сущности 2 разных классов, либо понятнее будет AddRoga и AddKopyta, либо с моделью чой-то не того (если из двух родителей добавляются одни и те же классы).

Проблема на уровне дочерних классов, а решение на уровне родительских. Кде тут ООП?
А чем это противоречит ООП? Это недостаток проектирования родителей?

Crew
23-02-2003, 22:11
Это недостаток проектирования родителей?

Недостаток в редактировании классов родителей, что не очень хорошо, особенно если родителей писал не сам или классы эти активно используются в других местах в первоначальном виде

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


Исправлено: Crew, 22:20 23-02-2003

vasketsov
23-02-2003, 22:15
но выполняют разные функции, и что самое приятное, нужны оба
Ну и называй их по разному.


класс дерева из класса списка и  класса узла
Довольно странная модель.

Crew
23-02-2003, 22:23
Что в ней странного? Но тем не менее...
У меня нет более интересной мысли применения множественного наследования. И я думаю мало у кого есть и получается, что возможность использования множественного наследования есть, но никому не нужна :)

Ork Yason
24-02-2003, 09:11
я не врубился...
а с каких это пор можно наследовать от двух предков???

vasketsov
24-02-2003, 11:34
Что в ней странного?
Я бы дерево наследовал от узла, а в нем сделал бы список как рядовой член класса. Сам подумай, добавление с списку - вешь тривиальная, к дереву - неясно куда добавлять без доп. данных.

Ork Yason
RTFM.

Crew
24-02-2003, 22:56
Да я просто привел пример, в котором можно было бы применить наследование. А насчет оптимальности кода я вообще молчу, потому что пытался два раза реализовать дерево и не получилось. Пользуюсь теми, что в VC зашиты (точнее в win32).

Я и хотел узнать, использует ли кто-нибудь множественное наследование или нет. :)

А если использует, то как с проблемами борется. Вот товарищ ivank, когда спорил какой язык лучше несколько раз упомянул, что в С++ есть множественное наследование. А я так смотрю нигде его нет больше В паскале нет в Javа тоже. И никто не страдает, никому как-будто бы и не приходится обходить подводные камни, связанные с его отсутствием, всем и так хорошо.

Исправлено: Crew, 23:06 24-02-2003

shurikan
05-12-2003, 05:38
Crew
Тема, хотя и немного устарела, но я внесу свою лепту. COM объекты и далее все используют множественное наследование. Иначе они просто не могли бы существовать. И вертикальным наследованием такую задачу решить затруднительно.
Кстати, в Delphi тоже есть этот механизм, только там для этого используются интерфейсы.




© OSzone.net 2001-2012