MISRA C++:2008 Rule 10-1-1

Классы не должны быть выведены из виртуальных основ

Описание

Определение правила

Классы не должны быть выведены из виртуальных основ.

Объяснение

Использование виртуальных основ может привести ко многим запутанным поведениям.

Например, в иерархии наследования, включающей виртуальную основу, самый производный класс вызывает конструктор виртуальной основы. Промежуточные вызовы виртуального базового конструктора игнорируются.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

class Base {};
class Intermediate: public virtual Base {}; //Noncompliant
class Final: public Intermediate {};

В этом примере проверка правил вызывает нарушение, когда Intermediate класс определяется из класса Base с virtual ключевое слово.

Следующее поведение может быть потенциальным источником путаницы. Когда вы создаете объект типа Final, конструктор Final непосредственно вызывает конструктор Base. Любой вызов на Base конструктор из Intermediate конструктор игнорируется. Вы можете увидеть неожиданные результаты, если не учитывать это поведение.

Проверяйте информацию

Группа: Производные классы
Категория: Консультационные
Введенный в R2013b