2012-02-28 7 views
1
class Base 
{ 
public: 
    virtual void f(int) 
    { 
     printf("Base f(int)\n"); 
    } 

    virtual void f(int, int) 
    { 
     printf("Base f(int, int)\n"); 
    } 
}; 

class Der : public Base 
{ 
public: 
    using Base::f; 

    virtual void f(double) 
    { 
     printf("Der f(double)\n"); 
    } 
}; 

この場合、基本クラスの両方の関数を使用することができます。しかし、派生クラスで、ベースから特定のオーバーロードされたメソッドのみを使用できるようにすることは可能ですか?たとえば、f(int)のみを使用できますが、f(int、int)は使用できません。派生クラス内の基底クラスと同じ名前と異なる署名を持つ関数を再表示する

+0

クラスは、名前空間ではありませんusingディレクティブは名前空間に使用するためのものです。 –

+5

@izomorphius基底クラスから派生クラスに名前を持ってくるときは、絶対に問題ありません。 –

+1

@izomorphius:いいえ、この場合はusingディレクティブが必要です。それ以外の場合、Der :: f(double)はBase :: f(int)をシャドウします。 – Tobias

答えて

4

usingディレクティブで基本クラスメソッドを選択的に再表示することはできません。残念ながら、それはすべてか何もありません。

3

これが行います。

class Der : public Base { 
... 
    virtual void f(int p) { return Base::f(p); } 

をパフォーマンスが懸念される場合、それはvoid Base::f(int)に静的なディスパッチになります。

+0

はい、可能です。 Mb私は私の質問ではっきりしていませんでした。興味深いのは、その "using"節で特定の基本メソッドを再現することです。 – Alecs

+0

別々の名前のベースからのものでない限り、それらを分けることはできません。 – justin

0

実際にすべて解除非表示にすることで、基本クラスからのみ特定のメンバーを非表示にすることも可能であるし、再度(プライベートオーバーライドを提供することによって)、特定のものに隠れ:

struct Base 
{ 
    void f(int) { 
     printf("Base f(int)\n"); 
    } 

    void f(int, int) { 
     printf("Base f(int, int)\n"); 
    } 
}; 

struct Der : Base 
{ 
    using Base::f; // unhide all f's from Base 

    void f(double) { 
     printf("Der f(double)\n"); 
    } 

// hide f(int, int) from Base by declaring it as private (no implementation needed) 
private: 
    void f(int, int); 
}; 

void Example() { 
    Der der; 
    der.f(1); // OK Base::f(int) 
    der.f(1.0f); // OK Der::f(double) 
    der.f(1,1); // compiler error: 'f' is a private member of 'Der' 
} 
関連する問題