Этот вопрос касается переопределения виртуального метода в производном классе с другим типом возвращаемого значения. Для следующего кода:Не удалось вернуть указатель производного класса при переопределении виртуального метода
class father {
public:
virtual father* ref() { return this; }
};
class child : public father {
virtual child* ref() { return this; }
};
Когда я пытаюсь получить указатель непосредственно, г ++ (F15, г ++ 4.5) сообщает «недопустимый переход от отца к ребенку»
child m_child;
father* pf = &m_child;
child* pc = pf->ref();
Я понимаю, ref() в дочернем классе, и это, вероятно, просто несоответствие типа времени компиляции.
Однако, есть ли способ сделать это без явного использования литого типа?
Дополнительная информация: Я понимаю причину, по которой компилятор сообщает об этой ошибке. Мне нужно что-то из коробки, которая может получить доступ к данным в производном объекте без явного преобразования указателя.
Класс отца используется для размещения различных дочерних дочерних объектов в списках или векторах, поэтому, когда элемент извлекается из списка или вектора, невозможно определить, к какому классу, к которому он принадлежит.
У меня есть внутренний метод записи и проверки типа дочернего класса. Но я не хочу явно преобразовывать указатель.
Например, я хотел бы сделать что-то вроде этого:
// assuming pf is pointer pointed to an item fetch from a vector
switch(fp->get_type()) {
case child_type1: fp->ref()->list1.push(data); break;
case child_type2: fp->ref()->list2.push(data); break;
case child_type3: fp->ref()->list3.push(data); break;
}
Прямо сейчас, мне нужно явно объявить новую переменную или явное преобразование FP к соответствующему типу в каждом конкретном случае и каждый раз, когда мне нужно для доступа к данным в производных классах, которые являются утомительными и запутанными.
Что я ожидаю: возможно, некоторые библиотеки ускорения могут делать похожие вещи по-другому, о которых я еще не знаю, или может быть стандарт C++ 11, но это должен быть специальный параметр компиляции?
Я думаю, что я прекрасно понимаю, почему компилятор сообщает о несоответствии типа. Мне не нужно объяснять, что здесь происходит. Мне нужно что-то из коробки. Чтобы дополнительно объяснить это, PLS см. Добавленное дополнительное описание. –