84

次のコードをコンパイルすると、clang は警告を発します。

struct Base
{
    virtual void * get(char* e);
//    virtual void * get(char* e, int index);
};

struct Derived: public Base {
    virtual void * get(char* e, int index);
};

警告は次のとおりです。

warning: 'Derived::get' hides overloaded virtual function [-Woverloaded-virtual]

(もちろん、前述の警告を有効にする必要があります)。

理由がわかりません。Base で同じ宣言をコメント解除すると、警告が閉じられることに注意してください。私の理解では、2 つの get() 関数は異なるシグネチャを持っているため、非表示にすることはできません。

クランは正しいですか?なんで?

これは、最近のバージョンの Xcode を実行している MacOS X 上にあることに注意してください。

clang --version
Apple LLVM version 5.0 (clang-500.1.74) (based on LLVM 3.3svn)

更新: Xcode 4.6.3 と同じ動作。

4

4 に答える 4

33

struct public インターフェイスをそのまま維持して警告を無効にする別の方法は次のとおりです。

struct Derived: public Base
{
    virtual void * get(char* e, int index);
private:
    using Base::get;
};

これにより、警告を黙らせている間、の消費者がDerived呼び出すことができなくなります。Derived::get(char* e)

Derived der;
der.get("", 0); //Allowed
der.get("");    //Compilation error
于 2015-05-12T13:45:39.213 に答える