[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)

상속의 생성자/소멸자
- 자식 클래스의 객체가 생성될 때
- 자식 객체 안에 부모 객체가 있는 것과 같다.
- 자식 생성자에서 우선적으로 하는건 부모의 생성자를 호출하는 것
- 소멸자는 자식 클래스 먼저 그후 부모 클래스를 마지막으로 소멸자를 호출시킨다.
생성자를 지정하기
- 부모 클래스의 생성자를 지정하지 않으면 디폴트 생성자가 호출
자식클래스생성자( ) : 부모클래스생성자( )
{
.........
}
```
## 재정의(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
{
... // 추가된 멤버
... // 재정의된 멤버
}