Преобразование подкласса в суперкласс в подкласс?

Моя программа должна обрабатывать различные виды «заметок»: NoteShort , NoteLong ... Различные виды заметок должны отображаться в графическом интерфейсе по-разному. Я определил базовый класс этих заметок, который называется NoteBase .

Я храню эти заметки в XML; и у меня есть класс, который читает из XML-файла и сохраняет данные заметок в vector list . Затем я обнаружил, что не могу получить их собственные типы, потому что они уже преобразованы в NoteBase * !

Хотя if (dynamic_cast (ptr)! = NULL) {...} может работать, это действительно ужасно. Реализация функций принимает NoteShort * или NoteLong * , поскольку параметр не работает. Итак, есть ли хороший способ справиться с этой проблемой?

ОБНОВЛЕНИЕ: Спасибо, ребята, за ответ. Не думаю, что это должно произойти, но это случилось. Я реализовал это по-другому, и теперь он работает. Однако, насколько я помню, я действительно объявил (чистую) виртуальную функцию в NoteBase , но забыл снова объявить ее в заголовках производных классов. Я предполагаю, что это вызвало проблему.

ОБНОВЛЕНИЕ 2 (ВАЖНО): Я нашел эту цитату из C ++ Primer, которая может быть полезна другим:

Иногда более удивительно то, что ограничение на преобразование от базы к производной существует, даже если базовый указатель или ссылка фактически привязана к производному объекту:

  Bulk_item bulk; 
Item_base * itemP = & bulk; // нормально: динамический тип - Bulk_item 
Bulk_item * bulkP = itemP; // ошибка: невозможно преобразовать базу в производную 
 

Компилятор не имеет возможности узнать во время компиляции, что конкретное преобразование действительно будет безопасным во время выполнения. Компилятор смотрит только на статические типы указателя или ссылки, чтобы определить, допустимо ли преобразование . В тех случаях, когда мы знаем, что преобразование из базового в производное безопасно, мы можем использовать static_cast (Раздел 5.12.4, стр. 183), чтобы переопределить компилятор. В качестве альтернативы, мы могли бы запросить преобразование, которое проверяется во время выполнения, с помощью dynamic_cast, которое описано в Разделе 18.2.1 (стр. 773).

6
задан wecing 4 November 2011 в 04:11
поделиться