반응형
접근지정자 중 Protected에 대해서 알아보겠습니다.
세 가지 접근지정자로 지정한 변수를 멤버변수로 갖고 있는 클래스를 만들어 확인해 보겠습니다.
#include <iostream>
using namespace std;
class Base
{
private:
int num1;
protected:
int num2;
public:
int num3;
void ShowData()
{
cout << num1 << ", " << num2 << ", " << num3;
}
};
지금 이 상태로는 protected에 차이를 알 수 없습니다. 그래서 이 클래스르 상속하고 있는 자식 객체를 하나 만들겠습니다.
class Derived : public Base
{
public:
void ShowBaseMember()
{
cout << num1;
cout << num2;
cout << num3;
}
};
여기서 num1 은 접근이 불가 하기 때문에 컴파일 에러가 납니다. 하지만 num2 와 num3은 접근이 가능합니다.
그렇다면, Protected는 상속관계에서 자식객체가 부모객체에 멤버 변수에 접근이 가능하게 해 준다는 것을 알 수 있습니다.
이번엔 protected 상속에 대해서 알아보겠습니다.
#include <iostream>
using namespace std;
class Base
{
private:
int num1;
protected:
int num2;
public:
int num3;
Base():num1(1),num2(2),num3(3){}
};
class Derived : protected Base
{};
int main()
{
Derived dr;
dr.num3;
}
위 코드 시행 결과 컴파일 에러가 발생합니다.
dr.num3 이 문장이 문제인데 분명, num3는 public으로 선언이 되었지만 num3 변수를 불러올 수 없습니다.
그 이유는 Derived 클래스에 Base 클래스가 상속이 될때 public 이 아닌 protected로 상속이 되어서입니다.
protected 로 상속이 된 객체는 상속된 객체 안에 멤버 변수/함수가 protected보다 넓은 범위지정연산자가 선언이 되면 protected로 바꾸어 버립니다.
반응형
'c++ > 상속(Inheritance)의 이해' 카테고리의 다른 글
[C++] 상속의 문법적인 이해 (0) | 2023.01.05 |
---|