C and C++


LANG.TYPE.BCVNV : Virtual and Non-Virtual Base Class

Summary

An inheritance hierarchy includes multiple inheritance from an accessible base class B, but some inheritance from B is virtual and some is not.

Properties

Class Name Virtual and Non-Virtual Base Class
Significance style
Mnemonic LANG.TYPE.BCVNV
Categories
AUTOSARC++14 AUTOSARC++14:M10-1-1 Classes should not be derived from virtual bases.
  AUTOSARC++14:M10-1-3 An accessible base class shall not be both virtual and non-virtual in the same hierarchy.
MisraC++2008 MisraC++2008:10-1-1 Classes should not be derived from virtual bases.
  MisraC++2008:10-1-3 An accessible base class shall not be both virtual and non-virtual in the same hierarchy.
MisraC++2023 MisraC++2023:13.1.1 Classes should not be inherited virtually
  MisraC++2023:13.1.2 An accessible base class shall not be both virtual and non-virtual in the same hierarchy
JSF++ JSF++:89 A base class shall not be both virtual and non-virtual in the same hierarchy.
Availability Available for C and C++.
Enabling Checks for this warning class are disabled by default, and require the unnormalized C ASTs for the project. To enable them, add the following WARNING_FILTER rule and RETAIN_UNNORMALIZED_C_AST specification to the project configuration file.
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Virtual and Non-Virtual Base Class"
Note that retaining the unnormalized ASTs will increase the disk space used to store the project representation, and may make the analysis take longer.

Example

class BaseA {};
class Int1: public virtual BaseA {};
class Int2: public BaseA {};
class DerivedX: public Int1, public Int2 {}; // 'Virtual and Non-Virtual Base Class' warning issued here:
                                             //  BaseA is both a virtual and a non-virtual base class

class BaseB {};
class Int3: public virtual BaseB {};
class Int4: public virtual BaseB {};
class DerivedY: public Int3, public Int4 {};                // ok: Int3 and Int4 are non-virtual only; BaseB is virtual only

class BaseC {};
class Int5: public BaseC {};
class Int6: public BaseC {};
class DerivedZ: public Int5, public Int6 {};                // ok: all base classes are non-virtual

If Virtual Base Class checks are enabled, a Virtual Base Class warning will also be issued for every class declaration that has a virtual base class: Int1, Int3, Int4.

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.