관리 메뉴

JIE0025

[ C++ ] 상속 본문

기타 학습/Language

[ C++ ] 상속

Kangjieun11 2022. 5. 20. 23:43
728x90

 

상속

클래스에서의 상속은 자기자신의 멤버를 물려주는것.

멤버변수와 멤버함수 모두 물려준다. 

 

 

상속해주는 클래스 : 기초, 슈퍼, 부모 클래스

상속받는 클래스 : 유도, 서브, 자식 클래스

 

 

- 부모의 모든 멤버를 자식이 물려받음

- 모든 멤버를 자식이 물려받지만 완전히 자식의 소유는 아니다. 

 

상속

자식 클래스 : 부모 클래스

 

예제 코드를 보면서 이해해보자. 

Parent 클래스와 

Parent를 상속받는 Child 클래스가 있다. 

#include<iostream>

using namespace std;

class Parent {
	int x, y;

public:
	Parent(const int& a, const int& b) {
		cout << "Parent 생성 \n";
		x = a;
		y = b;
	}
	~Parent() {
		cout << "Parent 소멸 \n";
	}

	int getX() const { return x; }
	int getY() const { return y; }
	void setX(const int& a) {
		x = a;
	}
	void setY(const int& b) {
		y = b;
	}
};

class Child :public Parent {
	int z;
public:
	Child(const int& a, const int& b, const int& c) :Parent(a,b){
		cout << "Child 생성 \n";
		z = c;
	}
	~Child() {
		cout << "Child 소멸 \n";
	}
	void printAll()const {
		cout << "z : " << z << '\n';
		cout << "x :" << getX() << " y : " << getY() << "\n";
	}
};
int main() {

	Child c(1, 3, 5);
	c.printAll();

	return 0;
}

 

 

- Child 클래스 내부에선 public 한 친구들까지 자유자재로 사용가능 하다.

- Parent 의 private는 Parent의 멤버 함수로만 접근 가능하다.

 

 

 

 

- 자식 클래스만 초기화 할 경우 자식은 부모 멤버의 초기화해야하는 의무가 있다. 

- main에서 Child를 만들었지만 Parent의 생성자가 먼저 호출되고 Child 생성자가 이후에 호출되는것을 볼 수 있다. 

 

- Child 생성자에서 : Parent(a,b) 를 넣어줌으로써 (이니셜라이저 사용해 생성자 호출 명시) Parent의 생성자로 a와 b값을 전달, x와 y에 먼저 값이 할당된다. 

>> 여기에서 Parent 생성이 호출됨.

- 이후 Childe 생성자 내부가 작동 >> Child 생성 출력후  z = c;가 작동한다. 

 

- Parent의 public 한 멤버함수 getX와 getY를 통해 Child에서 x와 y의 값을 읽을 수 있다.

 

- 소멸은 Child 먼저, Parent가 나중에 되는 것을 확인 할 수 있다.  (객체의 소멸순서는 생성순서와 반대)

 

 

 

protected? 

접근제어자 protected를 사용한 멤버변수는 이를 상속하는 유도클래스(자식)에서 접근이 가능하다

 

 

- class Child : public Parent 

>> public으로 상속받았다는 뜻

>> 어떤 접근제어자로 상속받았을 때 더 넓은 공개 범위를 가지는 멤버를 public으로 만들라는 뜻이다.

 

만약 private로 상속받으면 public protected 한 멤버까지 private한 멤버로 바꿔준다.

만약 protected로 상속받으면 public한 멤버를 protected로 바꿔주며, private는 바로 접근할 수 없다. 

 

 

실제로 public 상속 이외의  상속은 다중상속과 같이 특별한 케이스가 아닐 경우 잘 사용하지 않는다.

 

 

 

 

상속은 IS-A 관계

무선전화기는 일종의 전화기이다.  O 

 

자식 is a 부모

 

상속관계가 성립하기 위해 부모와 자식간의 IS-A 관계가 성립해야한다.

만약 묶으려는 두 클래스가 IS-A 관계가 성립 X 라면 적절한 상속의 관계가 아니다. 

 

HAS-A 관계

경찰이 권총을 소유하고 있다.

 

경찰 - 자식클래스

권총 - 부모클래스 

 

경찰 has a 권총

이 경우에도 상속으로 표현할 수 있다.