2012-03-24 12 views
9

基本クラスctorがプライベートである派生クラスオブジェクトをインスタンス化する方法はありますか?基本クラスctorがプライベートである派生クラスオブジェクトをインスタンス化します。

派生クラスctorは暗黙的に(プライベートである)基本クラスctorを呼び出すため、エラーが発生します。

accessing_private_ctor_in_base_class.cpp: In constructor derived::derived()': accessing_private_ctor_in_base_class.cpp:9: error: base::base()' is private accessing_private_ctor_in_base_class.cpp:18: error: within this context

どのように私は、コンパイルエラーを除去するために、コードを変更することができます。

#include <iostream> 

using namespace std; 

class base 
{ 
    private: 
     base() 
     { 
     cout << "base: ctor()\n"; 
     } 
}; 

class derived: public base 
{ 
    public: 
     derived() 
     { 
     cout << "derived: ctor()\n"; 
     } 
}; 

int main() 
{ 
    derived d; 
} 

このコードはコンパイルエラーを与える:

は、以下のこのコード例を考えてみましょうか?

答えて

14

2つの方法があります。

  • は、基底クラスのコンストラクタpublicまたはprotectedのいずれかを行います。
  • または、派生クラスを基本クラスのfriendにします。 demo
+1

@ Nawaz:派生クラスをベースクラスの友人にすることができました! –

1

できません。これは通常、唯一のc'torを非公開にし、継承を許可しない理由です。

+0

シングルトンにもその用途があります。 – chris

2

コンストラクタのみがプライベートであるベースクラスから継承することはできません。

だから、基本クラスのコンストラクタ公開/保護されたが作る、または別の基底クラスのコンストラクタを追加します。


1. Nawazが指摘するように、あなたは基本クラスの友人ではありません。

関連する問題