Re[14]: Вызов виртуального метода для класса
От: erithion aka tyomik  
Дата: 22.10.04 12:36
Оценка:
Здравствуйте, 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 ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.