GeneralPurpose-NonVirtualFunctionRedefinition

Non-virtual member functions shall not be redefined in derived classes

Required inputs: IR

When a derived class redefines a non-virtual function from a base class, it creates hidden functions rather than true overrides. This leads to confusion and bugs because the function called depends on the type of the pointer/reference, not the actual object type. If a function is meant to be overridden in derived classes, it should be declared virtual.
Bad code (non-virtual function redefinition):
class Base {
public:
    void Process() {}  // Non-virtual
};

class Derived : public Base {
public:
    void Process() {}  // ERROR: hides Base::Process, not an override
};

void Use(Base* ptr) {
    ptr->Process();  // Calls Base::Process even if ptr points to Derived
}
Good code (virtual function override):
class Base {
public:
    virtual void Process() {}  // Virtual - designed for override
};

class Derived : public Base {
public:
    void Process() override {}  // OK: true override
};

void Use(Base* ptr) {
    ptr->Process();  // Calls correct function based on actual type
}
Good code (no override needed):
class Base {
public:
    void Utility() {}  // Non-virtual utility function
};

class Derived : public Base {
public:
    // Don't redefine utility functions meant for single class
    void DerivedSpecific() {}  // Add derived-specific functions instead
};

Possible Messages

Key

Text

Severity

Disabled

redefinition_of_nonvirtual_function

Redefinition/hiding of non-virtual function.

None

False

Options

exclude_private_inheritance

exclude_private_inheritance : bool = False

If set, redefinition of functions from private inheritance is not reported.