c++/상속(Inheritance)의 이해

[C++] Protected 선언과 세 가지 형태의 상속

TIM_0529 2023. 1. 6. 15:58
반응형

접근지정자 중 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