Нельзя использовать динамическое приведение к объекту const


Я хочу написать метод, в котором указатель объекта Base будет передан в качестве параметра, а внутри метода он будет приведен к производному указателю объекта.

void func( const Base* const obj){
    Derived* der = dynamic_cast<Derived*>(obj);
}

Но это показывает ошибку, потому чтодинамическое приведение не может отбросить спецификатор const . Но я не понимаю, почему спецификатор const должен быть удален здесь, все, что я делаю, это создаю производный указатель, который должен указывать на некоторую величину смещения после базового указателя. Я тоже пытался const Derived* const der = dynamic_cast<Derived*>(obj);, но нет результат.

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

2 2

2 ответа:

Вы отбрасываете const, потому что вы этого не делали:

const Derived* der = dynamic_cast<const Derived*>(obj);

Если вам действительно нужен Derived*, то вам нужно

Derived* der = dynamic_cast<Derived*>(const_cast<ObjType*>(obj));

Чего вы не можете сделать, так это удалить квалификатор const с помощью dynamic_cast. Если типы полиморфны (имеют по крайней мере одну виртуальную функцию), вы должны уметь делать:

const Derived *der = dynamic_cast<const Derived*>(obj);