2012-01-26 3 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는 액세스 할 수 있습니다 가질 수있다 func_x에 대해 다르게 동작한다는 점을 제외하면 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_xprivate 것을 의미한다.

class container에있는 것처럼 func_x을 공개로 명시 적으로 선언해야합니다.

"기본 클래스에 public이 있다고해서 그것이 자동으로 유도 된 것을 의미하지는 않습니다."

편집 : 당신이 기본 클래스 멤버가 파생 클래스에 액세스 할 수 있도록하려면

, 당신이 그들을 protected 또는 public 중 하나를 선언해야합니다. 그래서, 당신의 후속 질문에 대답하는 미래에, 또한

private: 
    std::list<T> test; 

protected: 
    std::list<T> test; 

변경, 새로운 하나를 요청하기 위해 질문을 수정하지 않습니다. 새로운 문제를 다루기 위해 새로운 질문을 만들어야합니다. 새로운 질문에 더 이상 적용되지 않는 답변을 보는 사람들에게 오해의 소지가있을 수 있습니다.

+0

내가 추가 할 것입니다. 기지 안에'public'이 있기 때문에 그것이 자동으로 파생 된 것을 의미하지는 않습니다. –

+0

@SethCarnegie added :) –

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은 파생 된 상태입니다.

공개해야합니다.