Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
};