Russian Qt Forum
Ноябрь 24, 2024, 20:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Возможный баг в компиляторе MSVC 2013  (Прочитано 19123 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Июль 14, 2017, 09:34 »

не понятно, почему линкер не может связать ITaskName::GetName с CName::GetName по одинаковым сигнатурам.
Линкер тут ни при чем. Допустим Вы написали
Код
C++ (Qt)
CTask * task;
...
ITaskName * test = task;
 
Ожидается что test - наследник абстрактного ITaskName, т.е. поведение его виртуальных методов не зависит от раскладов множ наследования. А иначе выходит что подключая один и тот же класс туда-сюда мы изменяем его методы - так низзя
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #16 : Июль 14, 2017, 10:31 »

Racheengel, дело в том, что CTask содержит не одну виртуальную таблицу, а две, в каждой из которой имеется адрес на метод GetName и адреса напротив них записываются разные.

Вижу, но вот это как раз и кажется странным - почему две то?
Сигнатуры методов одинаковые, они оба абстракные, помечены как virtual по всему пути наследования.
Я бы ожидал, что абстракный ITaskName::GetName будет помещен в VMT от CTask.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июль 14, 2017, 11:50 »

Вижу, но вот это как раз и кажется странным - почему две то?
Потому что наследник автоматически приводится к любому базовому типу, который не может иметь "посторонок" в VMT
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #18 : Август 18, 2017, 08:24 »

Всем привет...
Наткнулся на странную вещь, которую иначе как багом компилятора, объяснить трудно.

вы отнаследовались от интерфейса.
а реализации чисто виртуальной функции не предоставили.

и почему то это у вас наследника нельзя создать?

и на будущие:
вместо того, что бы через одно место объяснять на пальцах,
лучше привести код (на онлайн компиляторе),
который наглядно иллюстрирует проблему.

как это сделали моральные люди в этой самой теме.

Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.237 секунд. Запросов: 22.