Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

Добро пожаловать на форум по технике высоких напряжений!
Для получения доступа ко всем разделам необходимо зарегистрироваться


Текущее время: 23 окт 2018, 00:58

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 23 окт 2017, 17:03 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4256
Откуда: Д-3
ToX@ писал(а):
как реализовать такой вызов, если базовая структура вложена в производную? В таком случае структура, выполняющая роль "таблицы виртуальных функций" (или указатель на такую структуру) напрямую в производную структуру не входит, входит как поле вложенной базовой структуры.

При конструировании объекта производного класса мы имеем возможность указателю vptr базового класса присвоить значение, указывающее на vtbl для производного класса. После этого все вызовы должны осуществляться правильно, проверь!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 23 окт 2017, 18:43 
Не в сети

Зарегистрирован: 10 сен 2010, 22:09
Сообщения: 278
Откуда: из Д3 я
Спасибо Даниилу Анатольевичу за помощь! все получилось!
Проблема была в том, что я в производную структуру включал не базовую, а указатель на нее. Возможно дело в том, что сам экземпляр базовой структуры, на который указывает этот указатель, в памяти может находиться вообще в другом месте, не там же, где экземпляр производной (это скорее всего зависит от того, как создавать экземпляры производной структуры в программе, т.е. от реализации функций-"конструкторов" базовой и производной структуры), или что-то в этом духе. Ведь чтобы работало "полиморфное поведение", нужно, чтобы указатель на структуру-"таблицу виртуальных методов" располагался в памяти, – что для экземпляра базовой структуры, что для экземпляра производной структуры, – на одинаковом смещении относительно ячеек, с которых начинается размещение этих экземпляров в памяти (адреса этих начальных ячеек и присваиваются указателям на эти экземпляры). В итоге мой совет: если хотите вложить базовую структуру в производную, включайте в неё саму структуру, а не указатель на нее.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 23 окт 2017, 18:46 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4256
Откуда: Д-3
\o/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 23 окт 2017, 18:51 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4256
Откуда: Д-3
Кстати, физически, наследование в C++ осуществляется именно вложением одной структуры в другую. Ну и полиморфизм реализуется так же как нужно сделать в задании - через vptr в базовом классе.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 23 окт 2017, 18:57 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4256
Откуда: Д-3
Можете проделать такой эксперимент с кодом на С++, который я приводил в самом начале темы. Выполните:

cout << sizeof(Shape) << endl;

для двух случаев:
– CalcArea() невиртуальная;
– CalcArea() виртуальная.

Во втором случае размер памяти, занимаемой объектом класса, окажется на 8 байт больше, это из-за добавления в класс скрытого указателя vptr (на vtbl). Строго говоря, размер класса должен был бы увеличиться только на 4 байта (под 32-разрядный указатель), но в c++ классы выравниваются в памяти блоками по 8 байт, и это то, о чем вам тоже полезно знать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 24 окт 2017, 02:48 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4256
Откуда: Д-3
На занятии нужно будет делать разбор домашнего задания или отложим это на неделю?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №3
СообщениеДобавлено: 24 окт 2017, 15:35 
Не в сети

Зарегистрирован: 12 окт 2016, 20:08
Сообщения: 14
Да, нужно, если никто не против


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB