상속 받는데도 다음과 같이 에러가 발생하는 이유가 무엇일까요?

 

// num_sequence.h
#include <iostream>
using namespace std;

class num_sequence
{
public :
 num_sequence(int, int);
 virtual ~num_sequence(){};
 int elem(int pos) const;
 virtual const char* what_am_i();

protected :
 bool check_integrity(int pos) const;
 int val[500];
 int _begin;
 int _end;
};

inline void display(ostream &os, num_sequence& ns, int pos)
{
 os<<\"The element at position \"<<pos<<\"for the \"<<ns.what_am_i()<<\"sequence is \"<<ns.elem(pos)<<endl;
}

//num_sequence.cpp
#include \"num_sequence.h\"
#include <iostream>
using namespace std;

num_sequence::num_sequence(int begin, int end)
{
 _begin = begin;
 _end = end;
}

int num_sequence::elem(int pos) const
{
 return val[pos];
}

bool num_sequence::check_integrity(int pos) const
{
 if(pos < 0)
 {
  cerr<<\"!! invalid position : \"<<pos<<\"Cannot honor request\\n\";
  return false;
 }
 return true;
}

//Fibonacci.h
#include \"num_sequence.h\"
#include <iostream>
using namespace std;

class Fibonacci : public num_sequence
{
public :
 friend ostream& operator<<(ostream& os, const Fibonacci &ns);
 Fibonacci(int begin, int end);
};

 

//Fibonacci.cpp
#include \"Fibonacci.h\"
#include <iostream>
using namespace std;

Fibonacci::Fibonacci(int begin, int end)
{

_begin = begin;

_end = end;
 for(int i = begin +1; i<end; ++i)
 {
  val[i] = val[i-2] + val[i-1]; //error : \'val\' : cannot access protected member declared in class \'num_sequence\'
 }
}

ostream& operator<<(ostream& os, const Fibonacci &ns)

{
 for(int i = 0; i<ns._end; ++i)

//error : \'_end\' : cannot access protected member declared in class \'num_sequence\'

(분명히 하위 클래스(Fibonacci)의 객체 ns의 멤버함수 _end에 접근하는데도 이렇게 에러가 발생합니다.)
 {
  os<<ns.val[i];
    }

 return os;
}

const char* Fibonacci::what_am_i()
{
 return \"Fibonacci\";
}

 

//Ex.cpp
#include <iostream>
#include \"Fibonacci.h\"
using namespace std;

int main()
{
 Fibonacci fib(1, 10);
 cout<<\"fib \"<<fib<<endl;
 display(cout, fib, 8);
 return 0;
}