2012-01-26 21 views
-1

私が動作するように次のコードのビットを作るしようとしている...私が行うことができるようにしたいどのような 仮想関数...なぜこれがプライベートで?

#include <list> 

template <typename T> 
class container{ 
public: 
    virtual T func_x(){ 
     T temp; 
     //do stuff with list<t> test 
     return temp; 
    } 
private: 
    std::list<T> test; 
}; 

template <typename T> 
class container2 : public container<T>{ 
public: 
    virtual T func_x(){ 
     T temp; 
     //do different stuff with list<T> test 
     return temp; 
    } 
}; 

container<T> x; 
container2<T> y; 

を宣言し、yがアクセス権を持っている持っていることができるようですxのすべてのパブリック関数に、それはfunc_xのために異なった動作をすることを除いて。

私が今持っている問題は、クラスにcontainer2でfunc_xが使用できないことです。

std::list<T> test; 

私はクラスコンテナを完全に公開しようとしました。まだダイスはありません。これはできますか?

ありがとうございます!

+2

フォローアップの質問にマッチするように私の回答を編集しました。また、将来、元の質問を変更せず、新しい質問をしてください。それは、質問と回答を読む他の人に誤解を招く可能性があります。 –

+0

が解決しました。ありがとう! –

答えて

3

メンバーは、クラスのデフォルトprivateである:

template <typename T> 
class container2 : public container<T>{ 
    //************ 
    // no modifier 
    virtual T func_x(){ 
     T temp; 
     //do different stuff with list<T> test 
     return temp; 
    } 
private: 
    std::list<T> test; 
}; 

には修飾子が指定されていないので、func_xは、privateであることを意味します。

あなたはclass containerのために持っているようにあなたは、明示的にパブリックとしてfunc_xを宣言する必要があります。

"基本クラスのpublicだからこそ、それが自動的に派生したものであることを意味するわけではありません。"

EDIT:あなたは、基本クラスのメンバーは、派生クラスでアクセスできるようにしたい場合は

、あなたがそれらprotectedpublicのいずれかを宣言する必要があります。だから、

protected: 
    std::list<T> test; 

private: 
    std::list<T> test; 

を変更、あなたのフォローアップの質問に答えるためにも、将来的には、新しいものを尋ねるために質問を編集しないでください。新しい問題に対処するために新しい質問を作成する必要があります。新しい質問にもはや当てはまらない回答を見ている人は、誤解を招く恐れがあります。

+0

私は次のように追加します:ベースに 'public'があるからといって、それが自動的に導出されたという意味ではありません –

+0

@SethCarnegieが追加されました:) –

1

あなたのクラス宣言にpublic:を追加する必要があります。それ以外の場合は、宣言されたすべてのメンバーは、デフォルトではプライベートです。

template <typename T> 
class container2 : public container<T>{ 
public: // <<==== ADD THIS 
    virtual T func_x(){ 
     T temp; 
     //do different stuff with list<T> test 
     return temp; 
    } 
private: 
    std::list<T> test; 
}; 
0

func_xは派生したオブジェクトによって再定義されているため、導出されたprivateというように問題があります。

あなたはそれを公開する必要があります。