기능의 처리를 실제로 담당하는 클래스
기능 제공의 핵심이 되기 때문에 모든 객체지향 프로그램에서 반드시 존재하는 클래스
데이터가 담긴 클래스와 그것을 관리하는 핸들러 클래스.
데이터가 담긴 클래스의 종류가 많아질 경우 핸들러 클래스에서 변경할 부분이 많아짐
→ 확장성이 떨어짐
하지만, 상속을 사용하면 핸들러 클래스에서 변경이 거의 없어짐
class UnivStudent : public Person
{
...
}
UnivStudent 클래스가 Person 클래스를 상속
→ UnivStudent 객체에는 UnivStudent 클래스에 선언된 멤버, Person 클래스에 선언되어 있는 멤버 존재
상속의 대상이 되는 클래스의 멤버까지도 객체 내에 존재
UnivStudent(char* myname, int myage, char *mymajor)
: Person(myname, myage)
{
...
}
이니셜라이저를 이용해 상속하는 클래스의 생성자 호출
접근제한의 기준은 클래스
→ 상속 받은 클래스에서 상속하는 클래스의 private 선언 멤버에 접근 불가
정보의 은닉은 하나의 객체 내에서도 진행
상위 클래스 ↔ 하위 클래스
기초(base) 클래스 ↔ 유도(derived) 클래스
슈퍼(super) 클래스 ↔ 서브(sub) 클래스
부모 클래스 ↔ 자식 클래스
class SoDerived : public SoBase
SoDerived dr3(23,24);
SoDerived
의 생성자 호출SoDerived dr1;
SoDerived
의 생성자 호출클래스의 멤버는 해당 클래스의 생성자를 통해 초기화
→ 생성자에서 동적 할당한 메모리 공간은 소멸자에서 해제
접근의 범위 : private < protected < pulic
protected로 선언된 멤버변수는 이를 상속하는 유도 클래스에서 접근 가능
기초 클래스와 유도 클래스 사이에서도 '정보은닉'은 지켜지는게 좋음
class Derived : public Base // public 상속
{
...
}
class Derived : protected Base // protected 상속
{
...
}
class Derived : private Base // private 상속
{
...
}
protected 상속 : protected보다 접근의 범위가 넓은 멤버는 protected로 변경시켜 상속
private 상속 : private 상속을 다시 상속할 경우, 의미 없는 상속이 됨
public 상속 : private을 제외한 나머지는 그냥 그대로 상속
상속을 위한 기본 조건 : IS-A 관계의 성립
HAS-A 관계도 상속의 조건은 되지만 복합 관계로 이를 대신하는 것이 일반적
상속으로 묶인 두 개의 클래스는 강한 연관성을 띔