Здравствуйте, elcste, Вы писали:
E>Здравствуйте, erithion aka tyomik, Вы писали:
E>c::fn — виртуальная функция.
Еще раз повторюсь, меня не интересуют стандарты, несмотря на то, что я тоже читал Страуструпа и другую не менее интересную литературу и тоже прекрасно помню, что всеми ими такой метод класса обзывается виртуальным.
С точки же зрения исследователя, я знаю другое, а именно, что это чистый метод класса в реализации МС С++ компилятора. Его виртуальность возникает вследствие перекрытия имен, которая разрешается в пользу виртуальности метода наследника. И виртуальность его косвенная, поскольку реализуется через переходник. На что собсно код и указывает. В виртуальной таблице класса с не адрес самой процедуры, а адрес так называемого переходника на процедуру(метод класса c::fn) с коррекцией указателя перед переходом. Обрати внимание еще раз, мож теперь понятнее буит:
.text:00401160 c_thunk_fn proc near ; DATA XREF: .rdata:c_vtblo
.text:00401160
.text:00401160 var_4 = dword ptr -4
.text:00401160
.text:00401160 000 sub ecx, [ecx-4]
.text:00401163 000 jmp c_fn
.text:00401163 c_thunk_fn endp
.text:00401170 -----------------------------------------------------------------------
.text:00401170 c_fn proc near ; CODE XREF: c_thunk_fn+3j
.text:00401170
.text:00401170 var_4 = dword ptr -4
.text:00401170
.text:00401170 000 push ebp
.text:00401171 004 mov ebp, esp
.text:00401173 004 push ecx
.text:00401174 008 mov [ebp+var_4], ecx
.text:00401177 008 push offset aCFn ; "c::fn"
.text:0040117C 00C call _printf
.text:00401181 00C add esp, 4
.text:00401184 008 mov esp, ebp
.text:00401186 004 pop ebp
.text:00401187 000 retn
.text:00401187 c_fn endp
Отсюда видно, что это есть механизм, с помощью которого возможна реализация положений стандарта и возникает он только при виртуальном наследовании. На самом же деле это есть обычный метод класса.
E>Виртуальные базовые классы инициализируются только из конструктора most derived class.
Я сказал про параметр, вследствие равенства нулю которого вызова конструктора базового класса вообще не происходит. Как бы я не наследовался, вызов все равно будет, т.е. если присутствует один параметр в конструктор, то пока что у меня он всегда был равен 1. Равенства же его 0 я пока не смог добиться. И пока не упомню ситуаций, когда такое возможно. Разве что для нужд компилятора в специфических ситуациях, когда тока так можно выйти из положения.
E>P.S. Учите язык.
Спасибо! Торжественно обещаю
А какой? Алгол?
Я слышал множество пунктов стандарта и предложений по реализации взято именно оттуда.
... locked in silent monolog ...