При рассмотрении унаследованного проекта, который должен портировать со старой версии Visual Studio (6) на новую версию (2017), мы наткнулись на эту ошибку времени выполнения, в которой мы получили неожиданный NULL после использования dynamic_cast<>()
на базовый класс. Вот типичный образец:
Учитывая этот код:
class a { public: a() {}; virtual ~a() {}; };
class b :public a { public: b() {}; virtual ~b() {}; };
class c : public b { public: c() {}; virtual ~c() {}; };
int main()
{
a *a_ = new b();
b *b_ = new c();
c *c_1 = dynamic_cast<c*>(b_); //<-- returns c_1 = non-null(actual pointer value)
c *c_2 = dynamic_cast<c*>(a_); //<-- returns c_2 = NULL
}
Я полагаю, что автор правильно настроил все классы для dynamic_cast<>()
. Класс с 'является' классом А, так что кажется удовлетворенным, а класс с 'является' классом Б, так что кажется удовлетворенным.
Мне интересно, заключается ли проблема в том, что a_
на самом деле является производным классом b, который теоретически мог бы быть фактически производным указателем на гипотетический класс d.
Я ржавый на своем c ++, и я мог бы использовать некоторую помощь здесь относительно основной причины и правильного решения.