Для чего нужно виртуальное наследование?
От: opener  
Дата: 04.11.11 19:44
Оценка:
Про устранение проблемы с ромбовидным наследованием знаю, однако сегодня, ковыряя файл стандартной библиотеки <ostream> натолкнулся на такое:

template<class _Elem,
    class _Traits>
    class basic_ostream
        : virtual public basic_ios<_Elem, _Traits>


Ну и на кой здесь виртуальное наследование от basic_ios?
Re: Для чего нужно виртуальное наследование?
От: opener  
Дата: 04.11.11 19:47
Оценка: 1 (1) +1
Здравствуйте, opener, Вы писали:

O>Про устранение проблемы с ромбовидным наследованием знаю, однако сегодня, ковыряя файл стандартной библиотеки <ostream> натолкнулся на такое:


O>
O>template<class _Elem,
O>    class _Traits>
O>    class basic_ostream
O>        : virtual public basic_ios<_Elem, _Traits>
O>


O>Ну и на кой здесь виртуальное наследование от basic_ios?


А, наверно догнал — все то же устранение проблемы с ромбовидным наследованием:

Если iostream наследуется от ostream и istream, то...
Re: Для чего нужно виртуальное наследование?
От: Erop Россия  
Дата: 07.11.11 08:36
Оценка:
Здравствуйте, opener, Вы писали:

O>

O>
O>template<class _Elem,
O>    class _Traits>
O>    class basic_ostream
O>        : virtual public basic_ios<_Elem, _Traits>
O>


O>Ну и на кой здесь виртуальное наследование от basic_ios?


Ни на кой. Исключительно ради совместимости с первыми версиями
Стандартную библиотеку С++ проектировали давно, опыта у всех мало было, вот и родили урода.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Для чего нужно виртуальное наследование?
От: igna Россия  
Дата: 07.11.11 12:45
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

E>Стандартную библиотеку С++ проектировали давно, опыта у всех мало было, вот и родили урода.


Все-таки не всё в стандартной библиотеке уродливо, STL например нет. А ввод-вывод да, уродлив, причем более уродливого я не знаю вообще ничего.
Re[3]: Для чего нужно виртуальное наследование?
От: Erop Россия  
Дата: 07.11.11 12:50
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Все-таки не всё в стандартной библиотеке уродливо, STL например нет. А ввод-вывод да, уродлив, причем более уродливого я не знаю вообще ничего.


К STL у меня очень сложное отношение. Ну да тут ужо был мегафлей на эту тему
Но STL -- это позднее дополнение, а отличии от потоков, сделанных давным-давно...

И они да, уродливы вообще везде.
Чего их не сдадут в утиль наконец я не понимаю, хоть ты тресни
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Для чего нужно виртуальное наследование?
От: B0FEE664  
Дата: 07.11.11 13:49
Оценка:
Здравствуйте, Erop, Вы писали:

E>И они да, уродливы вообще везде.

E>Чего их не сдадут в утиль наконец я не понимаю, хоть ты тресни

Это в каком смысле? В смысле реализации/архитектуры или само понятие потоков чем-то плохо?
И каждый день — без права на ошибку...
Re[5]: Для чего нужно виртуальное наследование?
От: Erop Россия  
Дата: 08.11.11 07:16
Оценка: 1 (1) +2
Здравствуйте, B0FEE664, Вы писали:

BFE>Это в каком смысле? В смысле реализации/архитектуры или само понятие потоков чем-то плохо?


Ну я бы, для начала напомнил, что перегрузка операторов каким-нибудь необычным способом -- это плохая практика. Ну да для операторов побитового сдвига потоков уже поздно что-то менять.
А вот иерархия потоков, то, каким местом туда прикручены локейлы и перекодировки, то, что имя обязано быть строкой байт и т. д. -- это всё, мягко говоря, неудобно. Про реализации вообще и говорить нечего. Это просто мегажуть. Простую, по идее, проблему решают мега сложным способом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Для чего нужно виртуальное наследование?
От: k.o. Россия  
Дата: 09.11.11 05:36
Оценка: +2
Здравствуйте, opener, Вы писали:

O>Про устранение проблемы с ромбовидным наследованием знаю, однако сегодня, ковыряя файл стандартной библиотеки <ostream> натолкнулся на такое:


Вообще, виртуальное наследование это и есть true-OOP наследование выражающее отношение is-a. Тип ведь не может быть дважды под-типом другого типа "Проблемы" с ромбовидным наследованием, как раз и получаются из-за того, что обычное наследование, хотя и является более эффективным механизмом, неточно выражает это отношение между типами.
Re[2]: Боян -- иллюстратор.
От: Erop Россия  
Дата: 10.11.11 15:13
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Вообще, виртуальное наследование это и есть true-OOP наследование выражающее отношение is-a. Тип ведь не может быть дважды под-типом другого типа "Проблемы" с ромбовидным наследованием, как раз и получаются из-за того, что обычное наследование, хотя и является более эффективным механизмом, неточно выражает это отношение между типами.



Да. Мне нравится такой пример, например.
Рассмотрим иерархию:
class человек;
class женщина : человек;
class военнослужащий : человек
class женщина военнослужащий : женщина, военнослужащий;

Так вот, женщина военнослужащий нифига не "дважды человек"

Но я этот пример уже где-то тут приводил
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Боян -- иллюстратор.
От: k.o. Россия  
Дата: 10.11.11 15:38
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, k.o., Вы писали:


KO>>Вообще, виртуальное наследование это и есть true-OOP наследование выражающее отношение is-a. Тип ведь не может быть дважды под-типом другого типа "Проблемы" с ромбовидным наследованием, как раз и получаются из-за того, что обычное наследование, хотя и является более эффективным механизмом, неточно выражает это отношение между типами.



E>Да. Мне нравится такой пример, например.

E>Рассмотрим иерархию:
E>class человек;
E>class женщина : человек;
E>class военнослужащий : человек
E>class женщина военнослужащий : женщина, военнослужащий;

E>Так вот, женщина военнослужащий нифига не "дважды человек"

E>Но я этот пример уже где-то тут приводил


Точно, помню этот пример, вот здесь
Автор: Erop
Дата: 06.04.11
было, хорошее описание, кстати, только с выводом я не согласен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.