Анализатор обнаружил, что вызов базового конструктора в списке инициализации выполняется с использованием неинициализированных полей дочернего класса.
Рассмотрим пример:
struct C : public Base { C(int i) : m_i(i), Base(m_i) {}; .... int m_i; };
Согласно стандарту, сперва инициализируются базовые классы в порядке, указанном в объявлении. На момент вызова конструктора 'Base' переменная 'm_i' ещё не инициализирована, поэтому исправить код можно, например, так:
struct C : public Base { C(int i) : m_i(i), Base(i) {}; .... int m_i; };
Также анализатор может обнаружить использование неинициализированных переменных, находящихся не только внутри класса, но и внутри базовых классов:
struct Base1 { Base1(int i) : m_base1(i) { }; virtual ~Base1() = default; .... int m_base1; }; struct Base2 { Base2(int i) : m_base2(i) { }; virtual ~Base2() = default; .... int m_base2; }; struct C : public Base1, public Base2 { C(int i) : m_i(i), Base1(m_base2), Base2(i) {}; .... int m_i; };
Если нужно инициализировать один из базовых классов полем другого, то нужно убедиться в том, что они инициализируются в нужном порядке:
struct C : public Base2, public Base1 { C(int i) : m_i(i), Base1(m_base2), Base2(i) {}; .... int m_i; };
Похожие проблемы способна искать диагностика V670. Однако она занимается поиском проблем, связанных с порядком инициализации полей одного класса, когда порядок инициализации переменных зависит от порядка их объявления в классе.
Данная диагностика классифицируется как:
|