제가 대학교 1학년 때 [명품 C++ Programming] 교재로 진행되는 C++ 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다.
(2022.9 ~ 2022.12)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.
🍑상속 관계에서의 함수 재정의
- 파생 클래스에서 기본 클래스의 멤버 함수로 원하는 작업을 할 수 없는 경우 사용
- 파생 클래스에 기본 클래스의 멤버 함수와 동일한 이름과 원형으로 함수를 재정의해서 사용 가능 -> 같은 클래스의 메모리부터 확인함
- 기본 클래스의 포인터로는 기본 클래스의 함수, 파생 클래스의 포인터로는 파생 클래스에 작성된 함수를 호출
→ 범위 지정 연산자로 재정의 된 함수와 기본 클래스에 작성된 함수 중에서 지정하여 호출 가능
→ ex) pDer->Base::f();
- 호출 관계는 컴파일 시에 결정
→ 정적 바인딩
- 컴파일 시간 다형성을 가짐
🍑가상 함수
virtual 키워드로 선언된 멤버 함수
virtual 키워드는 동적 바인딩 지시어로 컴파일러에서 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시
🍑오버라이딩
오버라이딩
- 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언
→ 변수에 대한 오버라이딩은 존재 하지 않음
- 기본 클래스의 가상 함수를 무력화 시킴
- 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩됨
→ 어느 클래스에 포함되는 포인터인지는 무관함
- 실행 시간 다형성을 가짐
- 오버라이딩의 조건을 만족하면 함수 재정의가 아닌 오버라이딩
오버라이딩의 조건
virtual
- 업 캐스팅
오버라이딩의 목적
- 다형성 실현
: 기본 클래스의 가상 함수가 파생 클래스에서 구현해야 할 함수 인터페이스를 제공 함으로써 하나의 인터페이스에 대해 서로 다른 모양의 구현이라는 다형성 실현
🍑동적 바인딩
- 파생 클래스의 객체에 대해 기반 클래스에 대한 포인터로 가상 함수를 호출 하는 경우
→ 파생 클래스에서 재정의한 가상 함수의 호출을 보장받는 선언
- 나중에 가상 함수를 호출 시 실행 중에 객체 내에 오버라이딩된 가상 함수를 동적으로 찾아 호출함
- 실행 중에 호출될 함수가 정해짐
→ 실행시간 바인딩, 런타임 바인딩, 늦은 바인딩
C++ 오버라이딩의 특징
1. 오버라이딩의 성공 조건
- 가상 함수 이름, 매개 변수 타입과 개수, 리턴 타입이 모두 일치
2. virtual 생략
- virtual 지시어는 상속되므로 오버라이딩 시에 파생 클래스에서 virtual 생략 가능
3. 가상 함수 접근 지정의 자유
🍑오버라이딩과 범위 지정 연산자::
- 기본 클래스의 가상 함수를 정적 바인딩으로 호출 가능
기본클래스 :: 가상함수()의 형태
🍑가상 소멸자
- 기본 클래스의 소멸자와 파생 클래스의 소멸자 모두를 실행시키기 위해 사용
- 동적 바인딩에 의해 파생 클래스의 소멸자가 실행되고 파생 클래스의 소멸자는 자신이 실행된 후 기본 클래스의 소멸자를 호출하도록 컴파일되므로 두 소멸자가 모두 순서대로 실행됨.
🍑오버 로딩, 함수 재정의, 오버라이딩 비교
- 오버로딩 : 함수 중복 작성
- 함수 재정의 : 가상함수가 아닌 기본 클래스의 멤버 함수를 파생 클래스에서 재작성 하여 정적 바인딩으로 처리
- 이름 매개변수 타입과 개수 리턴타입까지 완벽히 같은 원형으로 작성
- 오버라이딩 : 기본 클래스의 가상 함수를 파생 클래스에서 재작성하여 동적 바인딩을 유발
- 이름 매개변수 타입과 개수 리턴타입까지 완벽히 같은 원형으로 작성
🍑가상 함수를 가진 기본 클래스의 목적
가상 함수 오버라이딩
: 파생 클래스마다 다르게 구현하는 다형성
동적 바인딩 실행
: 파생 클래스의 가상 함수 실행