[열혈 C++] Chap07: Inheritance 상속
1. 상속의 문법적 이해
✏️상속 방법과 초기화
class Person{
private:
int m_age;
char m_name[20];
public:
Person(char* name, int age): m_age(age){
strcpy(m_name, name);
}
~Person();
void 대충 멤버함수();
}
class UniPerson : public Person // Person 상속
{
private:
char m_major[40];
public:
UniPerson(char *name, int age, char* major) : Person(name, age){
strcpy(m_major, major);
}
}
- 자식 클래스는 부모 클래스의 프로퍼티 + 자신의 프로퍼티를 갖는다
-
초기화는 생성자로 해주는 것이 안전하다.
자식(유도)클래스의 생성자는 자신이 상속한 부모(기초)클래스의 멤버를 초기화 할 필요가 있다. 따라서 자식클래스 생성자는 부모 클래스의 생성자를 호출하여 부모클래스의 멤버를 초기화하는 것이 좋다.
- 유도클래스라 할지라도 기초클래스의 private 멤버에 직접적으로 접근할 수는 없다(정보은닉). 따라서 public으로 선언된 함수를 통해 간접적으로 접근해야한다.
✏️유도클래스 객체 생성과 소멸
-
유도클래스 객체를 생성할 때, 기초 클래스의 생성자가 100% 호출된다. 이때, 기초클래스의 생성자를 명시하지 않으면 디폴트 생성자가 호출된다.
- 유도클래스 객체가 소멸될 땐, 유도 클래스의 소멸자가 실행되고 그 다음에 기초클래스의 소멸자가 실행된다. (스택)
- 동적 할당한 메모리 공간을 소멸자에서 해제한다.
2. protected와 상속형태
✏️protected 선언
- private < protected < public
- private과 protected 차이
- 유도클래스가 기초클래스의 protected로 선언된 멤버에 직접 접근할 수 있다.
✏️상속 세가지 형태
1) protected 상속
class Base{
private:
int n1;
protected:
int n2;
public:
int n3;
}
- Base클래스를 protected로 상속받으면, public 멤버가 protected로 변경되어 상속된다.
class derived : protected Base{
접근불가:
int n1;
protected:
int n2;
protected:
int n3;
}
2) private 상속
-
위와 비슷하게, 기초클래스의 멤버가 private 멤버로 변경된다.
class Base{ private: int n1; protected: int n2; public: int n3; } class derived : private Base{ 접근불가: int n1; private: int n2; private: int n3; }
3) public 상속
-
public이 범위가 제일 넓은 애여서 그냥 private은 접근 불가가 되고, 나머지는 변경없이 상속된다
class Base{ private: int n1; protected: int n2; public: int n3; } class derived : private Base{ 접근불가: int n1; protected: int n2; public: int n3; }
3. 상속을 위한 조건
✏️IS-A 관계
- “스마트폰은 일종의 전화기입니다” 혹은 “노트북은 일종의 컴퓨터입니다” 와 같은 관계
✏️HAS-A 관계
- 소유관계
- “경찰은 총을 소유한다” 와 같은 관계