1
class Foo
{
public:
    int fn()
    {
        return 1;
    }
    int fn(int i)
    {
        return i;   //2nd fn()
    }
};
class Bar:Foo
{
public :
    Foo::fn;
};
int main(int argc, char** argv)
{
    Bar b;
    cout<<b.fn(2)<<endl;
}

具象クラス「Bar」でfn(int)を非表示にすることが可能です

4

2 に答える 2

1

いいえ、名前空間から名前を「隠す」ことはできません。これは名前に関連しているため、同じ名前のすべての可能なオーバーロードが含まれます。

同様にunusing、名前/名前空間への道はありません。

この現象は、図書館の執筆者が常に知っておくべき、あまり知られていないADLの落とし穴につながります。


PS。サンプルコードでは、もちろん、lineという/*using*/ Foo::fn;行を削除することもできます...しかし、それは実際のコードではないと思います...。

于 2011-11-26T20:22:44.330 に答える
1

基本クラスを作成しprivateprotectedデフォルトprivateでは、を使用する場合classはこれまでのところ問題ありません)、使用しないでください。ただし、派生クラスの関数をオーバーライドします。

class Bar: private Foo
{
public:
    int fn() {return Foo::fn();}
};

int fn()これにより、Barと。でのみ表示されnot int fn(int)ます。もちろん、コンパイラは大声で叫びます。fnは仮想関数ではありませんが、それでもオーバーライドしますが、基本クラスの関数のみを呼び出す限り、すべて同じです。

于 2011-11-28T23:26:51.423 に答える