반응형
상속(Inheritance)
- 다른 클래스의 멤버 변수, 멤버 함수를 자신의 멤버인 것처럼 사용이 가능.
- B라는 클래스가 A 클래스를 상속하게 되면, B 클래스는 A 클래스가 지니고 있는 모든 멤버를 물려받는다.
- 클래스의 재사용과 관련이 있다.
상속 예제 코드
#include <iostream>
#include <string>
using namespace std;
class Person
{
private:
int age;
int height;
public:
Person(int _age, int _height) : age(_age), height(_height) { }
};
class Employee : public Person
{
private:
string department;
string position;
public:
Employee(string _department, string _position, int _age, int _height) : Person(_age, _height)
{
department = _department;
position = _position;
}
};
void main()
{
Employee employee("R&D", "Staff", 20, 180);
}
- Person 클래스를 상속한 Employee 클래스의 생성자는 부모 클래스인 Person 클래스의 멤버까지 초기화해야할 의무가 있다.
- 자식 클래스의 생성자는 부모 클래스의 생성자를 호출해서 부모 클래스의 멤버를 초기화하는 것이 좋다.
- (자식 클래스는 이니셜라이저(콜론 초기화)를 이용해서 상속 클래스의 생성자 호출을 명시할 수 있다.)
상속 용어 정리
Person | Employee |
상위 클래스 | 하위 클래스 |
기초(Base) 클래스 | 유도(Derived) 클래스 |
슈퍼(Super) 클래스 | 서브(Sub) 클래스 |
부모 클래스 | 자식 클래스 |
- 일반적으로 기초 클래스와 유도 클래스라는 표현을 사용한다.
상속 생성자 호출 순서 예제 코드
#include <iostream>
using namespace std;
class Base
{
private:
int baseNum;
public:
Base(int n) : baseNum(n)
{
cout << "Base(int n)" << endl;
}
~Base()
{
cout << "~Base()" << endl;
}
};
class Derived : public Base
{
private:
int derivNum;
public:
Derived(int n1, int n2) : Base(n1), derivNum(n2)
{
cout << "Derived(int n1, int n2)" << endl;
}
~Derived()
{
cout << "~Derived()" << endl;
}
};
void main()
{
Derived derived(10, 20);
//결과
//Base(int n)
//Derived(int n1, int n2)
//~Derived()
//~Base()
}
- 자식 클래스에서 생성자가 호출될 때, 이니셜라이저에 부모 클래스의 생성자가 호출이 되는지 확인한 후, 이니셜라이저에 있는 생성자가 호출될지 void형 생성자가 호출될지 정해진다.
- 자식 클래스를 만든다고 해서 자식 클래스의 생성자가 먼저 호출되지 않고, 부모 클래스의 생성자가 먼저 호출 되는것을 확인할 수 있다.
- 소멸자는 생성자와 반대로 자식 클래스, 부모 클래스 순으로 호출된다.
상속과 접근지시자
- public > protected > private
- 상속 관계에서는 public과 protected가 차이를 보이지 않는다.
- protected에 선언된 멤버는 자식 클래스에서도 자유롭게 사용할 수 있지만, 부모 클래스와 자식 클래스 사이에서도 '정보은닉'은 지켜지는게 좋다.
- 상속을 명시할 때 사용하는 접근지시자는 다음과 같은 특성을 가지고 있다.
- public : public 범위의 멤버를 public으로 변경시켜서 상속.
- protected : protected 보다 넓은(public) 접근 범위의 멤버를 protected로 변경시켜서 상속
- private : private 보다 넓은(public, protected) 접근 범위의 범버를 private로 변경시켜서 상속
- public 이외의 상속은 다중상속과 같이 특별한 경우가 아니라면 잘 사용하지 않는다.
상속의 조건
- 상속은 다음과 같은 조건에서 사용한다.
- IS-A((자식)은 (부모)이다) : Employee(자식 클래스)는 Person(부모 클래스)이다.
- HAS-A((자식)은 (부모)를 갖고있다) : Police(자식 클래스)는 Gun(부모 클래스)를 갖고있다.
- HAS-A의 관계는 다음과 같은 이유로 상속보다는 멤버로 갖고있는것이 더 좋은 모델이 될 수 있다.
- 총을 소유하지 않은 경찰을 표현해야 할 수도 있다.
- 경찰이 총이 아니라, 3단봉을 소유할 수도 있다.
- 결론 : 상속은 IS-A 관계의 표현에 적합. HAS-A 관계에서도 사용될 수 있으나, 프로그램 변경에 많은 제약을 가져다 줄 수 있다.
반응형
'Stack > C++' 카테고리의 다른 글
C++ 순수 가상함수, 추상 클래스 (0) | 2021.11.11 |
---|---|
C++ 업캐스팅, 오버라이딩, 가상함수 (0) | 2021.11.08 |
C++ 함수 오버로딩, Deault 매개변수 (0) | 2021.10.24 |
C++ this 포인터 (0) | 2021.10.24 |
C++ 복사 생성자 심화 (0) | 2021.10.17 |