警告 C26434
関数 'derived::function' は、非仮想関数 'base::function' (c.128) を非表示にします。
C++ Core Guidelines
C.128: 仮想関数は、virtual、override、final のうちの 1 つだけを指定する必要があります
解説
基底クラスで非仮想関数と同じ名前を持つ関数を導入すると、予期しない動作が発生する可能性があります。 外部スコープの名前と競合する変数名を導入するようなものです。 たとえば、基底クラスの関数をオーバーライドしようとしていたとします。 関数のシグネチャが一致しない場合に、オーバーライドを意図していたのに、代わりにオーバーロードになる可能性があります。 一般に、名前の隠ぺいは危険で、エラーが発生しやすくなります。
Core Guidelines では次のように検査されます。
- 現在のクラス内の、オーバーライドしない関数のみが検査されます。
- 基底クラスの非仮想関数だけが考慮されます。
- シグネチャの照合は実行されません。 非修飾名が一致すると、警告が出力されます。
例
この例では、派生クラスが非仮想関数を隠ぺいする方法と、仮想関数がオーバーロードとオーバーライドの両方を許可する方法を示します。
// 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
};