![]() |
На нашем пути существуют следующие проблемы:
Проблема неоднозначности Например: оба родителя используют метод add(int) А родители у нас А и В И предположим, что получившийся класс использует оба метода и ему они нужны для разных целей. После некоторго размышления оставляем оба метода например так void С::add(int n) { * A::add(n); } И вводим второй метод void С::add2(int n) { *В::add(n); } Ура, проблема решена А если двусмысленность более сложна? Сейчас это было необходимо из-за пересечения понятий наследования и параметрической перегрузки. Когда в С++ используется перегруженное имя, то сперва вызывается механизм наследования для поиска контекста, в котором определена функция. Затем типы параметров анализируются для снятия двусмысленности в пределах данного контекста. Предположим, что есть два класса А и В, для каждого из которых определен метод display. но у методов разные аргументы (int и double). Мы считаем, что так как эти два метода различаются по списку параметров, дочерний класс может наследовать от двух родителей и иметь доступ к обоим методам. Счазззз. Когда мы вызываем метод display с целочисленным аргументом, компилятор не может приянять решение, использовать ли функцию из класса A(которая соответствует типу аргумента) или же из класса В (которая встречается первой при заложенном в С++ алгоритме поиска; для ее вызова аргумент будет приведен от типа int к типу double). Копмилятор ругнется, но ругнется только в точке вызова метода, а не при описании класса. Звучит может угрожающе, но на самом деле это лечится, но только переопределением родительских классов, где методы необходимо объявить виртуальными (не чисто виртуальными), и компилятору станет ясно, что мы сделали это специально Проблема на уровне дочерних классов, а решение на уровне родительских. Кде тут ООП? Мне кажется цена использования множественного наследования слишком высокая, но может по неопытности... Кто реально пользовался множественным наследованием и получил приятные результаты (не ходил и не плевался после применения)? Это сообщение я уже постил, но на него никто не ответил |
Crew
Метод Add видимо несет некую "добавляющую" логику. В случае одного класса она понятна, но когда в один класс добавляются сущности 2 разных классов, либо понятнее будет AddRoga и AddKopyta, либо с моделью чой-то не того (если из двух родителей добавляются одни и те же классы). Цитата:
|
Цитата:
Цитата:
[s]Исправлено: Crew, 22:20 23-02-2003[/s] |
Цитата:
Цитата:
|
Что в ней странного? Но тем не менее...
У меня нет более интересной мысли применения множественного наследования. И я думаю мало у кого есть и получается, что возможность использования множественного наследования есть, но никому не нужна :) |
я не врубился...
а с каких это пор можно наследовать от двух предков??? |
Цитата:
Ork Yason RTFM. |
Да я просто привел пример, в котором можно было бы применить наследование. А насчет оптимальности кода я вообще молчу, потому что пытался два раза реализовать дерево и не получилось. Пользуюсь теми, что в VC зашиты (точнее в win32).
Я и хотел узнать, использует ли кто-нибудь множественное наследование или нет. :) А если использует, то как с проблемами борется. Вот товарищ ivank, когда спорил какой язык лучше несколько раз упомянул, что в С++ есть множественное наследование. А я так смотрю нигде его нет больше В паскале нет в Javа тоже. И никто не страдает, никому как-будто бы и не приходится обходить подводные камни, связанные с его отсутствием, всем и так хорошо. [s]Исправлено: Crew, 23:06 24-02-2003[/s] |
Crew
Тема, хотя и немного устарела, но я внесу свою лепту. COM объекты и далее все используют множественное наследование. Иначе они просто не могли бы существовать. И вертикальным наследованием такую задачу решить затруднительно. Кстати, в Delphi тоже есть этот механизм, только там для этого используются интерфейсы. |
Время: 17:17. |
Время: 17:17.
© OSzone.net 2001-