сбои dynamic_cast

Вы неправильно набрали имя метода жизненного цикла.

Вы, вероятно, хотите использовать ionViewWillEnter или ngOnInit

5
задан Igor Oks 26 February 2009 в 14:36
поделиться

6 ответов

Код, как отправлено, не должен перестать работать, если у Вас есть виртуальная функция в базовом классе (как litb указанный).

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

Единственная вещь, о которой я могу думать, состоит в том, что из-за некоторой странной ошибки все встраивается, и не vtable сгенерирован. Но если Вы помещаете конструктора в файл C++, компилятор решает не встроить все, инициировав создание vtable, заставляя Ваш бросок работать.

Но это - очень дикие догадки, и я не думаю, что какой-либо компилятор имел бы такую ошибку в нем (?)

Если Вы хотите определенный ответ, отправляете больше кода. И компилятор / платформа используется.

Править: Наблюдение обновленного кода

Я думаю, что необходимо, по крайней мере, произойти Полученный из Основы ;) (я предполагаю, что это - опечатка),

Но после наблюдения кода, единственная вещь, о которой я могу думать, состоит в том, что gcc (неправильно) встраивает все и не генерирует vtable для Полученного. Если это имеет значение это хорошо работает скомпилированное с gcc 4.0

3.1 более чем 7 лет к настоящему времени..., если бы существует возможность обновить, я пошел бы для нее.

5
ответ дан 18 December 2019 в 12:02
поделиться

Сделайте деструктор виртуальным, и поместите его (или по крайней мере один виртуальный метод) в .cpp файле.

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

У Вас должен быть по крайней мере один виртуальный метод для dynamic_cast для работы. Динамический состав исполнителей использует таблицу для выяснения информации о типе, и никакая таблица не составлена, при отсутствии виртуальных методов.

Если у Вас будет класс, что Вы ожидаете быть разделенными на подклассы, и он имеет деструктор или если класс будет иметь какие-либо переменные экземпляра, которые являются классами с деструкторами, то Вы действительно захотите сделать свой деструктор виртуальным (даже если он будет иметь пустое тело). Иначе очистки, которую Вы ожидаете, не произойдет для экземпляров подкласса.

3
ответ дан 18 December 2019 в 12:02
поделиться

У Вас есть какая-либо виртуальная функция в Основе? Это не будет работать иначе. Если ничто иное, сделайте его dtor виртуальное.

Не знайте, спросил ли это уже другой парень, который удалил его ответ, но я полагаю, что это было что-то другое: Вы делаете dynamic_cast от конструктора оснований? Если так, это не будет работать. Компилятор будет думать, что Основой является большая часть производного типа, подобного тому, когда Вы вызываете виртуальную функцию, и это заканчивает тем, что назвало версию Основы.

7
ответ дан 18 December 2019 в 12:02
поделиться

В рассмотрении Вашего кода я не вижу наследования. Вы забывали делать это? Полученный ни из чего не получен.

0
ответ дан 18 December 2019 в 12:02
поделиться

Вы делаете это в Visual C++? Я думаю, что Вы используете, чтобы должными быть позволить информации о типах во время выполнения (RTTI) в параметре компилятора для этого работать.

Не горите меня, если у меня есть эта несправедливость. Это было некоторое время, так как я использовал C++!!!

0
ответ дан 18 December 2019 в 12:02
поделиться

В коде Вы отправили Полученный, не получен из Основы.

Править: К вашему сведению измененный код хорошо работает с g ++ 3.4.5

0
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: