IT공부/이것이 C++이다
객체의 관계 규정과 설계_1
doublehyun
2022. 3. 16. 00:44
Chapter.6 상속 기본
- 상속이란?
- 상속(Inheritance)
- 객체 단위 코드를 '재사용'하는 방법, C++클래스가 C의 구조체와 구별되는 근거!
- 두 클래스 사이의 '관계'를 고려해 프로그램 작성
- 기본 문법
- [class 파생클래스이름 : 접근제어지시자 부모클래스 이름]
- ex) class MyData{ }; class MyDataEx : public CMyData { };
- CMyDataEx 클래스는 CMyData 클래스를 상속받아 생성된 파생클래스가 된다,
- 파생 클래스 인스턴스가 생성될 때 기본 클래스(부모 클래스)의 생성자도 호출된다
- 호출의 순서 1. 파생 클래스 생성자, 2. 부모 클래스 생성자
- 실행의 순서 1. 부모 클래스 생성자, 2. 파생 클래스 생성자
- 파생클래스는 기본클래스의 멤버에 접근 가능(private 제외)
- 사용자 코드에서는 파생클래스의 인스턴스로 기본 클래스 메서드를 호출할 수 있다
- [class 파생클래스이름 : 접근제어지시자 부모클래스 이름]
- 메서드 재정의
- 오버라이드(override) 메서드를 재정의 하면 기존의 것이 무시된다(대체된다)
- 기본 문법 및 특징
- 재 정의시 기본형식의 메서드를 호출하려면 반드시 소속클래스를 정의해야 한다 (그렇지 않으면 재귀호출 발생함)
- ex) CMyData::SetData(10);
- 재정의 한 이유 : 제거 X, (기존 메서드 + 현재 메서드) 묶어 한꺼번에 작동 시키기 위함이다
- 명시적 호출 : b.CMyData::SetData(15); // 메서드가 재 정의 되있어도 해당 클래스의 메서드가 실행된다
- 묵시적 호출 : b.SetData(15);
- 상위 클래스 참조자 형식으로 파생클래스에 대입했을 때 ( + 포인터도 )
- ex) CMydata &rdata = a; // CMydata a;
- rData.SetData(15); // CMyDataEx()의 SetData() 가 오버로드 됬으나 CMyData의 메서드가 실행됨
- 재 정의시 기본형식의 메서드를 호출하려면 반드시 소속클래스를 정의해야 한다 (그렇지 않으면 재귀호출 발생함)
- 상속에서의 생성자와 소멸자
- 과정
- 파생 클래스 생성자가 호출된다
- 파생 클래스 생성자가 실행되기 전에 부모 클래스의 생성자를 호출한다
- 부모 클래스 생성자가 실행되고 반환된다
- 파생 클래스의 생성자가 실행되고 반환된다
- 소멸은 생성의 역순(A -> B -> C | C -> B -> A)
- 따라서 파생 클래스 에서 부모 클래스의 멤버변수에 쓰기, delet 연산을 하면 안된다!!!
- 파생 클래스 생성자에서 부모 클래스 맴버 변수를 초기화 하지 않는다.
- 생성자 선택
- '생성자 상속'
- 다중 정의된 상위 클래스의 생성자들을 그대로 가져오는 문법
- ex)CMyDataEx(int nParam) : CMyData(nParam) { ~ }
- 파생 클래스 생성자 실행 전에 부모 클래스 생성자 호출함
- ex)CMyDataEx(int nParam) : CMyData(nParam) { ~ }
- 다중 정의된 상위 클래스의 생성자들을 그대로 가져오는 문법
- '생성자 상속'
- 과정
- 상속(Inheritance)