2011-01-05 12 views
6

基本クラスにメソッドがオーバーロードされ、private/protectedとして継承された派生クラスがあると仮定します。基本クラスの宣言にオーバーロードされたメソッド

  1. オーバーロードされたメソッドの元のアクセスレベルの1つまたはいくつかだけを復元できますか?
  2. GCC 4.4.0では、基本メソッドを保護されたアクセスのもとに置いて、プライベートアクセスを使って継承しています。アクセスレベルを一般公開に戻そうとすると動作します。これはどうやって動作するのでしょうか?それともコンパイラのバグですか?私の理解では、アクセスレベルの復元は、メンバーのアクセスレベルの昇格や降格に使用できないようにすべきです。

コードスニペット:

class base { 
    public: 
    void method() {} 
    void method(int x) {} 
    protected: 
    void method2() {} 
}; 

class derived : private base { 
    public: 
    base::method; // Here, i want to restore only the none parameterized method 
    base::method2; // method2 is now public?? 
}; 
+0

BTW-は 'base :: method'と全く同じ' base :: method'のような宣言ですか? – Kos

+0

@Kosですが、C++ 0xで 'base :: method;'と言うのはもはや有効ではありません。それはn3225ドラフトで削除されました。 –

答えて

4

using宣言のみ名宣言領域にを導入するという単純な理由のために与えられた過負荷に選択的に行うことができず、それは、定義により、過負荷が同じ共有機能します名。

私はここを参照してください唯一の選択肢は、些細な転送機能を使用することです:

class derived : private base 
{ 
public: 
    void method() { base::method(); } 

    using base::method2; // method2 is now public 
    // method(int) stays inaccessible 
}; 

私は私はあなたの2番目の質問を理解して非常にわからないんだけど、はい:あなたはを通して派生クラスでベース部材アクセシビリティを変更することができますusing宣言。

+0

完璧、感謝..これを@DeadMGの答えと組み合わせて、問題を解決した印を付けることができます.. –

1

あなたははそれ自体、アクセスを復元しません。あなたに設定してください。上記のように、以前にprivateと宣言されたメソッドを含む、すべてのメソッドに対するアクセスを明示的に設定することができます。

1

派生クラスがそれを望んでいた場合、保護されたメソッドがパブリックにならないようにすることはできません。マイナーラッパーを作成して実行するだけです。 privateは別の問題です。 using宣言を介して継承された機能のアクセシビリティを変更

+0

akh ...はい..それは意味があります..ありがとう..私は「C++ Complete References 4th Ed。」の章を読んでいました。「アクセス宣言を使用して、ただし、基底クラスでプライベートとして宣言されたメンバーは、派生クラスによって公開された にすることはできません(C++が許可されていれば、 のメンバーになります)。これは起こるために、それはその カプセル化メカニズムを破壊するでしょう!) "..私は彼が公衆のために意味し、同じレベルとみなされるために保護されたと思うと思う.. –

関連する問題