Warning C26434

Function 'derived::function' hides a non-virtual function 'base::function' (c.128).

C++ Core Guidelines

C.128: Virtual functions should specify exactly one of virtual, override, or final

Remarks

When you introduce a function that has the same name as a non-virtual function in a base class, you may get unexpected behavior. It's like introducing a variable name that conflicts with a name from an outer scope. For example, you may have intended to override a base class function. If the signatures of the functions don't match, the override you intended may turn into an overload instead. In general, name hiding is dangerous and error-prone.

In the Core Guidelines checks:

  • Only non-overriding functions in the current class are checked.
  • Only non-virtual functions of base classes are considered.
  • No signature matching is performed. Warnings are emitted if unqualified names match.

Example

This example demonstrates how a derived class can hide non-virtual functions, and how virtual functions allow both overloads and overrides:

// C26434.cpp
struct Base
{
    virtual ~Base() = default;
    virtual void is_virtual() noexcept {}
    void not_virtual() noexcept {}
};

struct Derived : Base
{
    void is_virtual() noexcept override {}      // Okay, override existing function
    virtual void is_virtual(int i) noexcept {}  // Add a virtual overload for function
    void not_virtual() noexcept {}              // C26434, hides a non-virtual function
    virtual void not_virtual(int i) noexcept {} // C26434, and parameters ignored
};