Информация об изменениях

Сообщение Re[3]: Полиморфизм и адреса от 25.01.2017 10:48

Изменено 25.01.2017 12:57 uzhas

Re[3]: Полиморфизм и адреса
Здравствуйте, RiNSpy, Вы писали:

RNS>Почему мы передаём один и тот же адрес в две функции, а печатаются разные адреса?


вот выхлоп на ваш исходный код: http://ideone.com/Wtmifr
мы передаем не просто адреса, а передаем указатель на класс, а функция в свою очередь принимает указатель на другой класс. идет преобразование, эквивалентное static_cast, которое учитывает расположение объекта в памяти и деает необходимые смещения

теперь разберем ваш второй пример ( http://ideone.com/tE1lde ). в нем лейаут объекта будет таким:
D = B | C
размер в данном случае получится таким (хотя и не обязательно так, но в простом примере все просто):
sizeof(D) = sizeof(int) + sizeof(B) + sizeof(C) = sizeof(int) + sizeof(int) + sizeof(int)

могу посоветовать гуглить по "C++ class layout"
первая внятная ссылка: http://www.openrce.org/articles/files/jangrayhood.pdf
Re[3]: Полиморфизм и адреса
Здравствуйте, RiNSpy, Вы писали:

RNS>Почему мы передаём один и тот же адрес в две функции, а печатаются разные адреса?


вот выхлоп на ваш исходный код: http://ideone.com/Wtmifr
мы передаем не просто адреса, а передаем указатель на класс, а функция в свою очередь принимает указатель на другой класс. идет преобразование, эквивалентное static_cast, которое учитывает расположение объекта в памяти, и делает необходимые смещения

теперь разберем ваш второй пример ( http://ideone.com/tE1lde ). в нем лейаут объекта будет таким:
D = B | C
размер в данном случае получится таким (хотя и не обязательно так, но в простом примере все просто):
sizeof(D) = sizeof(int) + sizeof(B) + sizeof(C) = sizeof(int) + sizeof(int) + sizeof(int)

могу посоветовать гуглить по "C++ class layout"
первая внятная ссылка: http://www.openrce.org/articles/files/jangrayhood.pdf