|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.12.2010, 15:49 | #1 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
convariant return types
добрый день. кто нить разбирался с сабжем? (конвариантный возвращаемый тип).
во всех примерах приводят примерно одинаковый код Код:
Код:
Код:
но я не догоняю, для чего это? зачем вообще нужна виртуальная функция с ковариантным типом, если мы хотим создать клон конкретного объекта (а не через указатель на базовый класс). все равно clone мы не сможем использовать через Base* (ибо тип возвращаемого значения виртуальной функции берется из базового класса). если б тип возвращаемого значения брался не из базового, а переопределенного класса я согласен, было бы удобно. в общем, разъясните мне идиоту. кой какая инфа есть тут http://www.lwithers.me.uk/articles/covariant.html но так же ничего не объяснено, зачем тут виртуал
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
21.12.2010, 16:28 | #2 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Я честно говоря прочитал и не смог понять что вас именно волнует так?
Код:
Возможно я не понял, но вроде все логично. |
21.12.2010, 16:36 | #3 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2BOBAH13
да, возвращается ДРУГОЙ тип и требует приведения типа, если мы хотим это использовать вот так Код:
Код:
Код:
Код:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
21.12.2010, 16:45 | #4 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Я не уверен, но на то что, у Base и Derived есть один и тот же метод clone, может virtual говорит о том, что Base::clone() не будет доступен т.к. существует теперь Derived::clone(). Но на счет данной теории "зачем?" стоит наверное посмотреть спецификацию C++, а именно virtual, боюсь я не могу ответить на столь специфический вопрос.
|
21.12.2010, 16:48 | #5 |
Форумчанин
Регистрация: 21.12.2010
Сообщений: 199
|
эм, какбэ в твоем коде (который без виртуал) ты создаешь экземпляр Base когда тебе нужно экземпляр Derived.. а это согласись немного не то что тебе надо
.. вобщем виртуал там для того чтоб ты мог из указателя на base (который на самом деле dreived) вызвать клон и получить derived, другого virtual не делает, если оно тебе ненадо то и не пиши его, меньше объект весить будет Последний раз редактировалось UltimaBeaR; 21.12.2010 в 16:52. |
21.12.2010, 16:51 | #6 | |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2BOBAH13
нет, virtual тут говорит как и всегда, что clone замещается в derived. но типы возвращаемого значения всегда берется из Base, поэтому нет возможности использовать clone полиморфно. я пока нашел один ответ. в base объявлена чисто виртуальная функция clone, остальные классы ее реализуют. и виртуальность тут нужна, чтоб не забыть в новом подклассе переопределить clone. но мне этот ответ не нравится 2UltimaBeaR ты невнимательно читал. яж описал, что ЕСЛИ БЫ ЭТО РАБОТАЛО (то что ты написал), ЭТО БЫЛО БЫ ОХРЕНЕТИТЕЛЬНОЙ СУПЕРФИЧЕЙ Цитата:
Код:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось Stilet; 21.12.2010 в 20:41. |
|
21.12.2010, 16:57 | #7 |
Форумчанин
Регистрация: 21.12.2010
Сообщений: 199
|
Вобще поидее если ты объявляешь виртуальную функцию с другим заголовком(возвращает другой тип) то эта уже другая виртуальная функция, незнаю будет ли это работать в этом случае, все таки классы из 1ой цепочки наследования, но помоему нет, - зачем так сделали хз
|
21.12.2010, 17:01 | #8 | |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2UltimaBeaR
Цитата:
вопрос открыт
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
|
21.12.2010, 17:14 | #9 |
Форумчанин
Регистрация: 21.12.2010
Сообщений: 199
|
дейсвтительно перезаписывается, тогда могу предположить что при полиморфном юзании clone() надо будет в любом случае приводить тип, если же не использовать виртуал то полиморфно юзать вобще не выйдет
|
21.12.2010, 17:19 | #10 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2UltimaBeaR
возможно. но если бы я хотел приводить тип, я бы не стал менять тип возвращаемого значения с Base* на Derived*, оставил бы Base*, приводил бы тип и этой темы вообще бы не было. а возможность не приводить тип при неполиморфном использовании не очень то и полезна
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Непонятки с return | CodeNOT | Общие вопросы C/C++ | 2 | 03.12.2010 23:56 |
Вопрос по return | fs444 | Общие вопросы C/C++ | 9 | 20.03.2010 15:07 |
return и echo | dedyshka | PHP | 5 | 31.01.2010 16:58 |
Method must have a return type????? | Bobrik | Помощь студентам | 5 | 18.05.2009 18:09 |