Udostępnij za pośrednictwem


Ostrzeżenie C26434

Funkcja "derived::function" ukrywa funkcję niewirtuacyjną "base::function" (c.128).

Podstawowe wytyczne dotyczące języka C++

C.128: Funkcje wirtualne powinny określać dokładnie jedną z wirtualnych, przesłonięć lub finalnych

Uwagi

Wprowadzenie funkcji o takiej samej nazwie jak funkcja niewirtualijna w klasie bazowej może spowodować nieoczekiwane zachowanie. To jak wprowadzenie nazwy zmiennej, która powoduje konflikt z nazwą z zakresu zewnętrznego. Na przykład może być konieczne zastąpienie funkcji klasy bazowej. Jeśli sygnatury funkcji nie są zgodne, przesłonięcia, które miały zostać zastąpione, mogą zamiast tego przekształcić się w przeciążenie. Ogólnie rzecz biorąc, ukrywanie nazw jest niebezpieczne i podatne na błędy.

W podstawowych wytycznych sprawdza:

  • Sprawdzane są tylko funkcje, które nie są zastępowane w bieżącej klasie.
  • Uwzględniane są tylko funkcje niewirtualne klas bazowych.
  • Nie jest wykonywane dopasowywanie podpisów. Ostrzeżenia są emitowane, jeśli nazwy niekwalifikowane są zgodne.

Przykład

W tym przykładzie pokazano, jak klasa pochodna może ukrywać funkcje inne niż wirtualne oraz jak funkcje wirtualne umożliwiają zarówno przeciążenia, jak i przesłonięcia:

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