2012-05-07 19 views
2

プライベート継承の間、パブリックメンバ変数またはBaseクラスのメンバ関数をDerivedのパブリックアクセス指定子に戻すことができます。 しかし、Baseクラスのpublicコンストラクタでも同じことができますか?次のように私はそれを試してみましたコンストラクタをプライベート継承で公開する

#include <iostream> 

using namespace std; 

class base 
{ 
     public: 
      base(){} 
      void print(){ puts("In print"); } 
}; 

class derived : private base 
{ 
     public: 
      base::print; 
      base::base; /* Throws an error - Declaration doesnt declare anything*/ 
      void display(){ puts("In display"); } 
}; 

int main() 
{ 
    derived dObj; 
} 

それは は私が有効しようとしています何をされたエラー「何を宣言doesntの宣言」をスロー

+0

これは興味深いです。しかし、なぜプライベートとして継承し、パブリックアクセスを提供したいのですか? – tuxuday

+1

C++ 11がないと、基本クラスからコンストラクタを継承することはできません。派生クラスのコンストラクタによって明示的に、または暗黙的に呼び出されます。 'derived'で使用したい' base'の他のメソッドについては、 'using'キーワードが必要です。 –

+2

@tuxuday - 私たちが個人的に継承し、1人または少数のメンバーにのみアクセスできるようにしたいが、基本クラス全体ではアクセスできないようにするために、私はそれを読む。メンバ変数と関数で動作します。私はちょうどコンストラクタにも試みました。 –

答えて

2

using構文を使用できます。しかし、それはusingの基本クラスのコンストラクタの感覚を多くしません。基本クラスを初期化したいと思いますか?あなたはそれのようにすることができます:

#include <iostream> 

using namespace std; 

class base 
{ 
     public: 
      base(){} 
      void print(){ puts("In print"); } 
}; 

class derived : private base 
{ 
     public: 
      using base::print; 
      derived() : base() {} // initialize base class 
      void display(){ puts("In display"); } 
}; 

int main() 
{ 
    derived dObj; 
} 
+0

はいベースを初期化できますその方法では、私は基本クラスのコンストラクタへのパブリックアクセスを派生して再割り当てできるかどうか試していました。 –

+0

さて、それでは[試用](http://ideone.com/eAr02)を与えてみませんか?あなたが得ることはエラーです: '' base :: base 'names constructor'。 – user2k5

+0

@ user2k5:試用版では、コンパイラの動作がわかります。私が正しくリコールすれば、C++ 11は構文を有効にしますが、ideoneのgccのバージョン(C++ 0xの場合でも)はそれをまだ実装していません。 @MatthieuM。 –

関連する問題