Форум
Компьютерные священные войны
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, pilgrim_, Вы писали: _>Здравствуйте, alex_public, Вы писали: _>>>>Но даже если говорить про прямой вызов, то как по твоему компилятор C# будет способен это сделать, если там всегда можно написать такой код (где B и C наследники A; а f - виртуальная функция, переопределённая в них): _>>>>[cs] _>>>>A a; _>>>>if(х) a=new B(); _>>>>else a=new C(); _>>>>a.f(); _>>>>[/cs] _>>>>Как по твоему компилятор сможет подставить здесь прямой вызов? ) _>>>Ессно никак, и будет виртуальный вызов, так же как и в C++ я думаю, ведь это чисто полиморфный код, нет? _>>Конечно. Но нюанс в том, что подобный код не скомпилируется в C++. _>Ну типа я в курсе :), добавим для C++ к A звездочку, я так понял что ты предостаивл типа псевдокод похожтй на C#/java :) _>>Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов. _>Тут тоже интересная тема, чем отличается для компилятора [b]A a; a.f.();[/b], от [b]A* a; a->f()[/b]; , что сlang ,что gcc генерят в последнем случае косвенный вызов. _>>В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? ) _>Никак, т.е влоб - полиморфно, так же ка и в C++ :)
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …