본문 바로가기

C++ 기초 1

[C++] 4-1 클래스의 상속 (inheritance)

클래스의 상속

   클래스 상속(inheritance)이란 이미 정의되어 있는 클래스의 속성 (데이터 멤버, 멤버 함수)를 다른 클래스에게 넘겨주는 것을 말한다. 이때 자신의 속성을 다른 클래스에 넘겨주는 클래스를 base class 혹은 parent class라 부른다. 속성을 상속받는 클래스는 derived(파생) class 혹은 child class로 불린다. 

   Parent class는 자신의 속성을 child class에게 넘겨줄 때 접근 지정자 public, private, protected를 사용해서 넘겨주게 된다. 접근 지정자는 상속의 유형을 결정하기 때문에 child class가 parent class의 멤버에 접근할 수 있는 범위는 접근 지정자에 따라 결정된다. 만약 접근 지정자를 지정하지 않으면 기본적으로 private로 설정된다. 

   Parent class의 멤버들은 private, protected, public으로 지정할 수 있다. parent class의 private 멤버는 child class에 상속되지 않는다. 만약 child class가 parent class의 private 멤버를 참조하려면 parent class의 public 멤버 함수를 이용해야 한다. 

   Parent class의 public 멤버는 child class에 상속되므로 child class에서 참조할 수 있다. parent class의 public 멤버는 접근지정자가 private이면 child class에 private 멤버로 상속되고, 접근 지정자가 protected이면 child class의 protected 멤버로 상속된다. 또한 접근 지정자가 public이면 child class에서도 public 멤버가 된다. 

   클래스의 멤버를 protected로 지정하면 private 멤버처럼 클래스 외부에서 참조할 수 없다. 그러나 parent class에서 protected 멤버는 private 멤버와 다르게 상속이 가능하다. parent class에서 protected 멤버는 접근 지정자가 private이면 child class에 private 멤버로 상속된다. 접근 지정자가 protected이거나 public이면 child class에서도 protected 멤버가 된다. 따라서 parent class에서 상속된 protected 멤버들은 child class에서는 참조할 수 있지만 public 멤버처럼 child class의 외부에서는 참조할 수 없다.  

 

기본 클래스의 멤버 유형 접근 지정자별 parent class의 접근 범위
private protected public
private 접근 불가 접근 불가 접근 불가
protected private protected protected
public private protected public

 

예제
#include <iostream>
using namespace std;
class parent {
protected:
	char* name;
public:
	void set_1(char* n) {	//기본 클래스의 정의
		name = n;
	};
};

class child : public parent {	//파생 클래스의 정의, 접근지정자 public
private:
	int age, height;
public:
	void set_2(int a, int h) {
		age = a; height = h;
	}
	void output_2(){
		cout << "name=" << name << endl;
	cout << "age=" << age << ", height=" << height << endl; }
};

int main()
{
	child ob;
	ob.set_1((char *)"Hong");
	ob.set_2(6, 125);
	ob.output_2();
	return 0;
}
실행 결과
name=Hong
age=6, height=125
  • 접근 지정자가 public이므로 parent class의 protected 멤버 name은 child class의 protected 멤버로 상속된다. 
  • 데이터 멤버 name은 parent class와 child class에서만 참조할수 있으므로 ob를 사용해서 main()함수 내에서 ob.name와 같이 사용하면 오류가 발생한다.
 
참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13