Share via


警告 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
};