Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 6

Виртуальные функции и наследование в скомпилированном коде

21.05.2015, 21:59. Показов 519. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, сабж. Ну почти. Хочу создать библиотеку, где некоторая функция должна принимать указатель на базовый объект и вызывать определенный метод. Этот базовый класс будут наследовать другие. Ясное дело метод надо сделать виртуальным и все отлично, но будет ли это работать в скомпилированном виде? Что бы я в программе слинковал свою библиотеку, наследовал базовый класс, и, передав указатель на него как на базовый в функцию, получил желаемый вызов метода из моего нового наследника?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// lib.cpp
extern void dosomething(Base *b){
    b->vmeth();
}
 
virtual void Base::vmeth(){
    // smth
}
 
// lib.h
class Base{
public:
    //...
    virtual void vmeth();
}
 
// program.cpp
class Naslednik : public Base{
public:
    //...
    virtual void vmeth(){
        // smth different
    }
}
 
WinMain(/*...*/){
    Naslednik n;
    dosomething(&n);
    return 0;
}
Добавлено через 2 часа 53 минуты
UP?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2015, 21:59
Ответы с готовыми решениями:

Наследование и виртуальные функции
Скажите, часто ли вы при проектирование реальных программ используете наследование?

Наследование и виртуальные функции
Задание : 1.Определить иерархию классов (в соответствии с вариантом). 2. Реализовать классы. 4.Написать демонстрационную программу, в...

Наследование и виртуальные функции
⦁ Определить иерархию классов (в соответствии с вариантом). ⦁ Определить в классе статическую компоненту - указатель на начало...

5
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
21.05.2015, 22:37
Цитата Сообщение от plotter Посмотреть сообщение
но будет ли это работать в скомпилированном виде?
Будет.
0
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 6
22.05.2015, 01:19  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Будет.
Спасибо, а где об устройстве этого почитать можно, какими трюками это все организуется, происходит ли что-то с таблицей виртуальных функций и т. д. и т. п.?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
22.05.2015, 01:32
теоритически при разных параметрах сборки либы и бинаря что-то может работать криво.
если все ок, то трюки достаточно простые.
упрощенно: линкеру нужен объектный код. а он либо в объектных файлах, либо в либине (она своего рода контейнер объектонго кода кучи других файлов, ведь ее создает тоже линкер, собирая все объектные файлы
в один такой lib файл), либо и там и там. вот он берет объектные файлы и либу (которая "контейнер объектных файлов") и собирает все это в один бинарь.
(объектный файл - то, что генерит компилятор после компиляции одного исходника (одной еденицы трансляции и прочие термины)).
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
22.05.2015, 09:55
Цитата Сообщение от plotter Посмотреть сообщение
какими трюками это все организуется, происходит ли что-то с таблицей виртуальных функций
у Вашего наследника будет указатель на vtable, и в ней для вызова метода vmeth будет подставлен указатель именно на реализацию предоставленную классом Naslednik
0
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 6
22.05.2015, 13:28  [ТС]
Perfilov, спасибо
aLarman, спасибо
Разобрался, итог отладки:
C++
1
2
3
4
5
6
7
/*
1. При наследовании создается копия таблицы, то есть, B содержит A, но этот А уже с новой таблицей, и неважно, переопределяются функции или нет
1.1. Адреса переопределенных методов заменяются новыми, остальные остаются как были
2. При обычном вызове через объект не тратится время на вытаскивание адресов из таблицы, сразу подставлены адреса функций
2.1. При вызове через указатель/ссылку вся эта рутина присутствует, поэтому описанное в сабже проканает
3. Конструкция B bbb; ((A)bbb).f(); вроде как создает новый объект А с аргументом bbb (конструктор копирования по ссылке) и вызывает A::f(), возможно, из-за конфликта с п.2
*/
К п.3:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
;    Не силен в ассемблере
;    Этот код написал компилятор vs без оптимизаций и прочего
 
;    ((A)bbb).f();
 
lea eax, [bbb] ; ссылка на bbb
push eax
lea ecx, [ebp-34Ch] ; адрес созданного класса
call A::A (010119FBh) ; конструктор
mov dword ptr [ebp-354h], eax ; хз зачем он кладет вернувшийся из конструктора eax(=this) на 8 байт раньше
mov ecx, dword ptr [ebp-354h] ; this
mov edx, dword ptr [ecx] ; vtable
mov ecx, dword ptr [ebp-354h] ; this
mov eax, dword ptr [edx] ; vtable[0] == A::f()
call eax
 
;    Результат: вызов A::f(), и, если добавить в класс какую-нибудь переменную и пустить в вывод, напечатает значение (копию) bbb
;    Скорее всего, в релизе с выставленными параметрами многое изменится
Всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2015, 13:28
Помогаю со студенческими работами здесь

Наследование и виртуальные функции
Всем привет. Может кто, пожалуйста, объяснить одну строчку из задания? Не понимаю, что именно нужно сделать. Само задание: Написать...

Наследование и виртуальные функции
Доброго времени суток, нужна ваша помощь в создании программы "Написать программу, в которой создается иерархия классов. Включить...

Наследование и виртуальные функции
Доброго времени суток. Есть два вопроса: 1) Подскажите, плиз, что делаю не так. Есть базовый класс human и класс наследник solder....

Виртуальные функции и наследование
в общем есть исходный класс shape- фигура в которой определены 2 виртуальные функции инициализации и создания class shape { ...

Наследование и виртуальные функции
Общая постановка. Программа должна содержать: - базовый класс Х, включающий два элемента х1, х2 типа int, - конструктор с параметрами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru