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