1-1. 접근 제어 지정자
1-2. 상속에서의 생성자와 소멸자
• 자식 클래스의 객체가 생성될 때, 부모 클래스의 생성자 또한 호출됨
• 마찬가지로, 자식 클래스의 객체가 소멸될 때, 부모 클래스의 소멸자 또한 호출됨
1-3. 상속의 유형
• 상속 선언 시 public, private, protected의 3가지 중 하나 지정
• 기본 클래스의 멤버의 접근 속성을 어떻게 계승할지 지정
• public : 기본 클래스의 protected, public 멤버를 그대로 계승
• private : 기본 클래스의 protected, public 멤버를 private으로 계승
• protected : 기본 클래스의 protected, public 멤버를 protected로 계승
1-4. 오버라이딩
• 자식 클래스가 필요에 따라 상속된 함수를 다시 정의하는 것으로, 이를 통해 다형성(polymorphism)을 부여 가능
2. 다중 상속
• 선언
• 활용
• 문제점
• Base의 멤버가 이중으로 객체에 삽입
• 동일한 x를 접근하는 프로그램이 서로 다른 x에 접근하는 결과
• 가상 상속(상속 지정자 앞에 virtual 키워드 사용)이나 범위 지정자(상속받는클래스::멤버이름)를 이용하여 해결
3. 다형성
• 객체들의 타입이 다르면 똑같은 메시지가 전달되더라도 서로 다른 동작을 하는 것
• OOP에서 하나의 코드로 다양한 타입의 객체를 처리가능
3-1. 업 캐스팅
• 자식 클래스 타입을 부모 클래스타입으로 변환
• 즉, 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것
• 예) 사람을 동물로 봄
• 예제
3-2. 다운 캐스팅
• 부모 클래스 타입을 자식 클래스타입으로 변환
• 즉, 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것
• 예제
4. 가상 함수
• 만약 부모 클래스의 포인터를 통하여 멤버 함수를 호출하더라도, 자식 클래스의 종류에 따라서 서로 다른 이름이 같은 함수가 호출되도록 하는 것
• virtual 키워드로 선언된 멤버 함수
• virtual 키워드는 동적 바인딩 지시어
• 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시
4-1. 동적 바인딩
• 바인딩이 실행 시까지 연기되고 실행 시간에 실제 호출되는 함수를 결정하는 것
• 정적 바인딩 : 컴파일 단계에서 호출하는 함수를 결정하는 것이 모두 완료되는 것
4-2. 다형성 예제
4-3. 오버라이딩
• 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언 및 정의
• 기본 클래스의 가상 함수의 존재감 상실시킴
• 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩
• 함수 재정의라고도 부름
• 특징
• 가상 함수의 이름, 매개 변수 타입과 개수, 리턴 타입이 모두 일치
• 오버라이딩 시 virtual 지시어 생략 가능
• 가상 함수의 virtual 지시어는 상속됨, 파생 클래스에서 virtual 생략 가능
• 가상 함수의 접근 지정
• private, protected, public 중 자유롭게 지정 가능
• 목적
• 파생 클래스에서 구현할 함수 인터페이스 제공
• 다형성의 실현
4-4. 오버로딩 vs 오버라이딩
4-5. 가상 소멸자
• 다형성을 사용하는 과정에서 소멸자를 virtual로 해주지 않으면 문제가 발생
• 자식 클래스의 소멸자가 호출되지 않음
• 부모 클래스의 소멸자를 virtual로 선언하면 문제 해결
4-6. 순수 가상 함수
• 함수 선언만 존재하고 함수의 정의는 없는 함수
• 실행할 코드를 작성할 목적이 아님
• 사용 방법
4-7. 추상 클래스
• 순수 가상 함수를 하나라도 가지고 있는 클래스
• 추상 클래스의 모든 멤버 함수를 순수 가상 함수일 필요는 없음
• 온전한 클래스가 아니므로 객체 생성 불가능
• 추상 클래스의 포인터는 선언 가능
• 상속에서 기본 클래스의 역할을 하기 위함
• 순수 가상 함수를 통해 파생 클래스에서 구현할 함수의 형태(원형)을 보여주는 인터페이스 역할
• 추상 클래스를 단순 상속하면 자동 추상 클래스
• 추상 클래스를 상속받아 순수 가상 함수를 오버라이딩
• 파생 클래스는 추상 클래스가 아님