Ошибка сегментации при использовании dynamic_pointer_cast
Следующий фрагмент кода является MWE проблемы, с которой я сталкиваюсь std::dynamic_pointer_cast
:
#include <iostream>
#include <memory>
class foo {
private:
int x;
public:
foo() : x(0) {}
foo(int xx) : x(xx) {}
virtual ~foo() = default;
int get_x() const { return x; }
};
class bar : public foo {
private:
double y;
public:
bar(double yy) : foo(), y(yy) {}
double get_y() const { return y; }
};
int main(void) {
bar b(0.5);
std::shared_ptr<foo> fptr = std::make_shared<foo>(b);
std::cout << (std::dynamic_pointer_cast<bar>(fptr))->get_x();
return 0;
}
Эта программа вызывает ошибки в строке выходного потока (std::cout << ...
) предположительно потому что dynamic_pointer_cast
приводит к nullptr
, но я не уверен, почему это так?
Любая помощь приветствуется, плюс здесь есть ссылка Coliru на фрагмент.
1 ответ
Решение
Это ожидаемое поведение. fptr
управляет указателем, который указывает на foo
по факту. Когда вы понижаете его до указателя на bar
через dynamic_cast приведение не будет выполнено, и вы получите нулевой указатель.
Если fptr
указывает на bar
тогда это сработает. например
std::shared_ptr<foo> fptr = std::make_shared<bar>(b);