2

ここで何が起こっているのか -- なぜこれはコンパイルされないのですか?

#include <iostream>
class Base {
    void print(double d) {
        std::cout << "Base: " << d << std::endl;
    }
};

class Derived : public Base {
void print(std::string const & str) {
        std::cout << "Derived: " << str << std::endl;
    }
};

int main(int argc, char* argv[]) {
    Derived d;
    d.print(2.);
    d.print("junk");
}

(MinGW と VC11 の両方で、 と同等のエラーが発生しNo conversion from double to std::stringます。)

で印刷関数の名前を変更すると、Derived正常にコンパイルされるため、明らかに何らかの方法Derived::print(string const &)でマスキングされています。Base::print(double)しかし、関数のシグネチャには引数の型が含まれているので、このマスキングはここで行う必要があるという印象を受けました。基本クラスのメソッドの場合、それは正しくありませんか?

4

1 に答える 1

3

いいえ、正しくありません。名前の隠蔽は、同じ名前の関数が同じスコープで宣言されている場合に発生します。ここprintでは、ofをDerived 隠蔽します。printBase

関数検索のこの (最初の) ステップでは、引数の名前/型は無視されます。

宣言を使用して、派生関数内に Base 関数の宣言を含めることができますusing

using Base::print

これを行うと、定期的な過負荷の解決が行われます。

この派生/ベースの状況で隠蔽が発生する理由の詳細については、完全に回答するこの他の SO 投稿をお勧めします。

標準に関しては、この特定のルールがセクション 3.3.1 で定義されています。

名前の隠蔽[basic.scope.hiding]

名前は、ネストされた宣言領域または派生クラス (10.2) で同じ名前を明示的に宣言することによって非表示にすることができます。

于 2014-06-09T21:45:17.660 に答える