Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 180 181 [182] 183 184 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2716
,
|
|
|
|
Цитата DesweR @ Вот если бы было так, недоразумений было бы меньше... Цитата void Func(Base& b) { b.Method(); } int main() { Derive d; Func(&d); } А оно, в общем-то, есть. Цитата void Func(Base* b) { b->Method(); } int main() { Derive d; Func(&d); } Соседство указателей и ссылок в С++ - отдельная песня Добавлено Цитата MyNameIsIgor @ Написали "передать по значению родителя" - так вам и было сделано. Разрешили копирование полиморфного класса - он и скопировался. Нет. Я написал "передать в функцию объект, параметром которой является родитель этого объекта", перед этим определив виртуальный метод. А то, что по с++-вски это переводится так, как вы написали - грабли. Добавлено Однако . А это противоречит утверждению: |
|
Сообщ.
#2717
,
|
|
|
|
Цитата IL_Agent @ Нет. Я написал "передать в функцию объект, параметром которой является родитель этого объекта" В ваших фантазиях там может быть хоть "вещь покрепче Фауста", а что было в реальности читайте в Стандарте. Цитата IL_Agent @ А то, что по с++-вски это переводится так, как вы написали - грабли. Я вижу грабли только в вашем восприятии действительности. |
|
Сообщ.
#2718
,
|
|
|
|
Цитата IL_Agent @ А это противоречит утверждению Ничего ничему не противоречит. Тип определяет набор операций, которые доступны для конкретной переменной. Декларация аргумента определяет способ его передачи в функцию (по значению/ссылке/указателю). |
|
Сообщ.
#2719
,
|
|
|
|
Цитата IL_Agent @ Вообще-то там написано "передать копию объекта типа Base" Я написал "передать в функцию объект, параметром которой является родитель этого объекта" |
|
Сообщ.
#2720
,
|
|
|
|
Цитата MyNameIsIgor @ Лол? Смеяться надо? Я где-то говорил, что отличия синтаксические? Наоборот, я сказал, что одна и та же запись в плюсах и яве означает разные вещи. тогда прекратите задавать глупые вопросы Цитата Что значит "не так"? Синтаксис не тот? Что явно не надо указывать передачу по ссылке? Так и в шарпе точно так же. Ну, так а кто сказал, что синтаксис идентичен? Просто они построены на ссылочной семантике, а плюсы - на значениях. Ничего криминального не вижу - это просто надо знать. А по поводу логичности разделения в шарпе на ссылочные типы и значения уже обсуждалось... Цитата MyNameIsIgor @ korvin, простите, я не имею желания разбирать ваше узелковое письмо, для которого даже подсветки нет. поэтому специально для Вас я сделал небольшой комментарий вконце. система типов тут при том, что если при тайпчеке происходит переписывание типа переменной, то при передаче по ссылке: реализация не приводится к супертипу значению: реализация не приводится к супертипу (это как в джаве) в противном случае при передаче по: ссылке: реализация не приводится к супертипу значению: реализация приводится к супертипу (это как в плюсах) интерфейс во всех случаях приводится. исключение -- языки с динамической типизацией я не понимаю, что ты подразумеваешь под этими словами Добавлено и это не зависит от семантики объектов, ссылки они или значения |
|
Сообщ.
#2721
,
|
|
|
|
Цитата trainer @ Вообще-то там написано "передать копию объекта типа Base" ![]() ![]() void Func(Base b) Где написано "копия" ? ![]() ![]() Derive d; Func(d); Где я передаю Base ? |
|
Сообщ.
#2722
,
|
|
|
|
Цитата IL_Agent @ А где написано ссылка? Где написано "копия" ? |
|
Сообщ.
#2723
,
|
|
|
|
Цитата MyNameIsIgor @ В ваших фантазиях там может быть хоть "вещь покрепче Фауста" Цитата MyNameIsIgor @ Я вижу грабли только в вашем восприятии действительности. Переход на личности засчитываем как слив |
|
Сообщ.
#2724
,
|
|
|
|
Цитата IL_Agent @ Так претензия в том, что там нет в явном виде русского слова "копия"? т.е. по-твоему там для передачи копии должно было бы писаться так?Где написано "копия" ? ![]() ![]() void Func(КОПИЯ! Base b) |
|
Сообщ.
#2725
,
|
|
|
|
Цитата Повстанець @ А где написано ссылка? Где я писал, что мне нужна ссылка ? Я передаю наследника с переопределённой виртуальной функцией и хочу, чтобы работал полиморфизм. |
|
Сообщ.
#2726
,
|
|
|
|
Цитата IL_Agent @ Полиморфизм работает только через ссылки/указатели. Где написано, что там должна быть ссылка, или указатель? Где я писал, что мне нужна ссылка ? Я передаю наследника с переопределённой виртуальной функцией и хочу, чтобы работал полиморфизм. |
|
Сообщ.
#2727
,
|
|
|
|
Цитата IL_Agent @ Где написано "копия" ? В учебнике по C? |
|
Сообщ.
#2728
,
|
|
|
|
Цитата Повстанець @ Полиморфизм работает только через ссылки/указатели. Вот про эти грабли я и толкую. А если полиморфизм не работает, зачем вообще разрешать передавать наследников без определения приведения типа ? |
|
Сообщ.
#2729
,
|
|
|
|
Цитата IL_Agent @ Про какие грабли? Полиморфизм везде работает через ссылки/указатели. Но в одних языках это дело под капотом, потому как все типы ссылочные. У некоторых открыта, потому как ссылочные типы надо объявлять вручную. А у некоторых ни тудым ни сюдым. Всегда надо помнить о двойственности системы типов. И соответственно о разных семантиках для одного синтаксиса.Вот про эти грабли я и толкую. Цитата IL_Agent @ Разрешено всё, что не запрещено. А если полиморфизм не работает, зачем вообще разрешать передавать наследников без определения приведения типа ? |
|
Сообщ.
#2730
,
|
|
|
|
Цитата trainer @ Так претензия в том, что там нет в явном виде русского слова "копия"? Претензия в том, что не работает полиморфизм. Цитата trainer @ т.е. по-твоему там для передачи копии должно было бы писаться так? По-моему, лучше так: ![]() ![]() Func( obj.Clone() ); |