почему dynamic_cast возвращает нуль с многоуровневым наследованием - PullRequest
0 голосов
/ 12 января 2019

При рассмотрении унаследованного проекта, который должен портировать со старой версии 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 ++, и я мог бы использовать некоторую помощь здесь относительно основной причины и правильного решения.

1 Ответ

0 голосов
/ 12 января 2019

a_ указывает на b. Когда вы пытаетесь dynamic_cast<c*>(a_); попытаться получить c из него, нет объекта c, только b, поэтому приведение завершается неудачно, и вы получаете нулевой указатель. b_ работает, потому что b_ фактически указывает на c.

...