Я пытаюсь получить производный тип объекта через виртуальную функцию базового класса. Я написал это, которое не компилируется:
struct base {
virtual base& get_this() {
return *this;
}
};
struct derived : base {
virtual derived& get_this() override {
return *this;
}
void fn();
};
int main () {
base* pd = new derived();
derived& x = pd->get_this(); /*ERROR*/
x.fn();
return 0;
}
... выдает мне ошибку: я не могу инициализировать derived&
из base
. Поскольку get_this
является виртуальным, почему pd->get_this()
возвращает base&
вместо derived&
? Заранее спасибо!
РЕДАКТИРОВАТЬ:
Спасибо всем за их полезные ответы и извинения за мой поздний ответ. Я должен был указать в исходном сообщении, что меня также интересует решение моей проблемы, а не просто выяснение того, почему вышеприведенное не компилируется. Моя основная проблема заключается в том, что fn
уникален для класса derived
и не может быть вызван через базовый класс. Использование приведения, безусловно, решает проблему, но я ненавижу писать код с конструкциями if else только для того, чтобы получить правильный тип (также Скотт Мейерс советует не приводить :)). Ответы, кажется, указывают на то, что броски - это путь, который, по крайней мере, обнадеживает, что я не пренебрегаю более "элегантным" решением моей проблемы. Еще раз спасибо!
dynamic_cast
, который будет жизнеспособным решением для описанного варианта использования. Никто больше не упомянул об этом в ответах, и то, как ковариация поддерживается в С++, не решает основную проблему ОП. - person πάντα ῥεῖ   schedule 21.10.2013