Uyarı C26434
'derived::function' işlevi sanal olmayan 'base::function' (c.128) işlevini gizler.
C++ Temel Yönergeleri
C.128: Sanal işlevler tam olarak sanal, geçersiz kılma veya son işlevlerden birini belirtmelidir
Açıklamalar
Temel sınıftaki sanal olmayan bir işlevle aynı ada sahip bir işlev tanıttığınızda beklenmeyen davranışlar alabilirsiniz. Dış kapsamdaki bir adla çakişen bir değişken adı eklemeye benzer. Örneğin, temel sınıf işlevini geçersiz kılmayı amaçlamış olabilirsiniz. İşlevlerin imzaları eşleşmiyorsa, amaçladığınız geçersiz kılma bunun yerine aşırı yüklemeye dönüşebilir. Genel olarak, ad gizleme tehlikeli ve hataya açıktır.
Temel Yönergeler denetimlerinde:
- Yalnızca geçerli sınıfta geçersiz kılmayan işlevler denetleniyor.
- Yalnızca temel sınıfların sanal olmayan işlevleri dikkate alınır.
- İmza eşleştirmesi yapılmaz. Nitelenmemiş adlar eşleşirse uyarılar yayılır.
Örnek
Bu örnek, türetilmiş bir sınıfın sanal olmayan işlevleri nasıl gizleyebileceğini ve sanal işlevlerin hem aşırı yüklemelere hem de geçersiz kılmalara nasıl izin verebileceğini gösterir:
// 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
};