Sdílet prostřednictvím


Upozornění C26434

Funkce "derived::function" skryje ne-virtuální funkci base::function (c.128).

C++ Core Guidelines

C.128: Virtuální funkce by měly přesně určovat jednu z virtuálních, přepisovaných nebo konečných

Poznámky

Když zavádíte funkci, která má stejný název jako ne virtuální funkce v základní třídě, může dojít k neočekávanému chování. Je to jako zavedení názvu proměnné, který je v konfliktu s názvem z vnějšího oboru. Možná jste například chtěli přepsat funkci základní třídy. Pokud se podpisy funkcí neshodují, může se místo toho přepsat, které jste chtěli, přetížit. Obecně platí, že skrytí názvů je nebezpečné a náchylné k chybám.

V základních pokynech kontroluje:

  • Kontroluje se pouze nepřepíšení funkcí v aktuální třídě.
  • Zvažují se pouze ne virtuální funkce základních tříd.
  • Neprovádí se žádná shoda s podpisem. Upozornění se vygenerují, pokud se shodují nekvalifikované názvy.

Příklad

Tento příklad ukazuje, jak odvozená třída může skrýt ne-virtuální funkce a jak virtuální funkce umožňují přetížení i přepsání:

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