[c++] 상속

상속(inheritance)

class ChildClass : 접근지정자 ParentClass
{
	.......... // 추가된 멤버 변수와 멤버 함수
};
  • 자식은 부모 클래스의 모든 멤버들을 모두 상속
  • public 선언되야 자식 클래스에서 사용 가능
  • 상속은 일방향성이다.
    • 자식 클래스에서 정의된 메소드는 부모 클래스에 의해 사용될 수 없다.

상속은 is-a관계

  • 자동차는 탈 것이다. (car is vehicle)

has-a (포함) 관계는 상속으로 모델링하면 안 된다.

  • 도서관은 책을 가지고 있다. (library has book)
  • 클래스 안에 다른 클래스의 객체를 포함시킨다.
    class Point {
        int x;
        int y;
    }
    class Line {
        Point p1; // 객체 포함
        Point p2;
    }
    

접근 지정자

  • 부모의 private는 자식클래스에서 접근하지 못한다. 그럼 public으로 해야하냐? -> protected(외부에선 접근x)
    alt text

상속의 생성자/소멸자

  • 자식 클래스의 객체가 생성될 때
    • 자식 객체 안에 부모 객체가 있는 것과 같다.
    • 자식 생성자에서 우선적으로 하는건 부모의 생성자를 호출하는 것
    • 소멸자는 자식 클래스 먼저 그후 부모 클래스를 마지막으로 소멸자를 호출시킨다.

생성자를 지정하기

  • 부모 클래스의 생성자를 지정하지 않으면 디폴트 생성자가 호출
자식클래스생성자( ) : 부모클래스생성자( )
{
.........
}
```	

## 재정의(overriding)
- 상속받은 멤버 함수를 변경하는 것
	
*부모 클래스의 멤버 함수만 호출할 수도있다.  
- 객체.클래스명::멤버함수()
- SportsCar 클래스의 객체 sc를 사용하여 부모 클래스인 Car 클래스의 getHP( ) 호출
	```cpp
	sc.Car::getHP( )
	```

### 재정의 조건
- 부모 클래스의 멤버 함수와 동일한 시그니처를 가져야함
	- 멤버 함수의 이름,반환형,매개변수 타입이 같아야함.

### 중복 정의와 재정의 차이
- 중복 정의(overloading)
	- 같은 이름의 멤버 함수를 여러 개 정의하는 것  
- 재정의(overriding)
	- 부모 클래스에 있던 상속받은 멤버 함수를 다
시 정의하는 것	

## 부모 클래스를 상속받는 방법
```cpp
class 자식클래스 : public 부모클래스
{
......
}
  • 상속의 종류
public으로 상속 protected private
부모클래스의 public 멤버 public protected private
protected 멤버 protected protected private
private 멤버 x x x
#include <iostream>
using namespace std;
class ParentClass {
private:
	int x;
protected:
	int y;
	public:
	int z;
};
class ChildClass1 : public ParentClass { };
class ChildClass2 : protected ParentClass { };
class ChildClass3 : private ParentClass { };

int main()
{
	ChildClass1 obj1;
	ChildClass2 obj2;
	ChildClass3 obj3;
	cout << obj1.x << endl; // 불가능
	cout << obj1.y << endl; // 불가능: y는protected로 유지된다.
	// ChildClass1 내에서는 사용 가능
	cout << obj1.z << endl; // 가능: z는public으로 유지된다.
	cout << obj2.x << endl; // 불가능
	cout << obj2.y << endl; // 불가능: y는protected로 유지된다.
	// ChildClass2 내에서는 사용 가능
	cout << obj2.z << endl; // 불가능: z는public에서protected로 변경되었다.
	// ChildClass1 내에서는 사용 가능
	cout << obj3.x << endl; // 불가능
	cout << obj3.y << endl; // 불가능: y는protected에서private로 변경되었다.
	cout << obj3.z << endl; // 불가능: z는public에서private로 변경되었다.
	return 0;
}

그렇다면 public 접근자를 y변수에 만들어보면?

public:
	int z;

	ParentClass() {
		x = 1;
		y = 1;
		z = 1;
	};

	int gety() {
		return y;
	}
...
int main()
{
	ChildClass1 obj1;
	ChildClass2 obj2;
	
	cout << obj1.gety() << endl; // 가능
	cout << obj2.gety() << endl; // 불가능
	
	return 0;
}

-> obj2의 경우 protected로 상속받았기에 public 멤버 함수 또한 protected가 되면서 접근하지 못한다.

다중 상속(multiple inheritance)

  • 하나의 자식 클래스가 두 개 이상의 부모 클래스로부터 멤버를 상속받는 것
class Sub : public Sup1, public Sup2
{
... // 추가된 멤버
... // 재정의된 멤버
}