Freigeben über


Warnung C26434

Die Funktion "derived::function" blendet eine nicht virtuelle Funktion "base::function" (c.128) aus.

C++ Core Guidelines

C.128: Virtuelle Funktionen sollten genau eine der virtuellen Funktionen, außer Kraft setzen oder endgültig angeben.

Hinweise

Wenn Sie eine Funktion einführen, die denselben Namen wie eine nicht virtuelle Funktion in einer Basisklasse aufweist, erhalten Sie möglicherweise unerwartetes Verhalten. Es ist wie die Einführung eines Variablennamens, der mit einem Namen aus einem äußeren Bereich in Konflikt kommt. Sie können z. B. eine Basisklassenfunktion außer Kraft setzen. Wenn die Signaturen der Funktionen nicht übereinstimmen, kann die von Ihnen beabsichtigte Außerkraftsetzung stattdessen zu einer Überladung werden. Im Allgemeinen ist das Ausblenden von Namen gefährlich und fehleranfällig.

Überprüfen Sie in den Kernrichtlinien Folgendes:

  • Es werden nur nicht außerkraftsetzungsfunktionen in der aktuellen Klasse überprüft.
  • Es werden nur nicht virtuelle Funktionen von Basisklassen berücksichtigt.
  • Es wird kein Signaturabgleich ausgeführt. Warnungen werden ausgegeben, wenn nicht qualifizierte Namen übereinstimmen.

Beispiel

In diesem Beispiel wird veranschaulicht, wie eine abgeleitete Klasse nicht virtuelle Funktionen ausblenden kann und wie virtuelle Funktionen sowohl Überladungen als auch Außerkraftsetzungen zulassen:

// 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
};