[명품 C++ Programming] chapter 9 : 가상 함수와 추상 클래스(1) - 가상 함수, 오버라이딩과 동적바인딩

eunee22·2024년 2월 1일

명품 C++ Programming

목록 보기
33/34

제가 대학교 1학년 때 [명품 C++ Programming] 교재로 진행되는 C++ 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다.
(2022.9 ~ 2022.12)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.

🍑상속 관계에서의 함수 재정의

  • 파생 클래스에서 기본 클래스의 멤버 함수로 원하는 작업을 할 수 없는 경우 사용
  • 파생 클래스에 기본 클래스의 멤버 함수와 동일한 이름과 원형으로 함수를 재정의해서 사용 가능 -> 같은 클래스의 메모리부터 확인함
  • 기본 클래스의 포인터로는 기본 클래스의 함수, 파생 클래스의 포인터로는 파생 클래스에 작성된 함수를 호출
    → 범위 지정 연산자로 재정의 된 함수와 기본 클래스에 작성된 함수 중에서 지정하여 호출 가능
    → ex) pDer->Base::f();
  • 호출 관계는 컴파일 시에 결정
    → 정적 바인딩
  • 컴파일 시간 다형성을 가짐

🍑가상 함수

  • virtual 키워드로 선언된 멤버 함수
  • virtual 키워드는 동적 바인딩 지시어로 컴파일러에서 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시

🍑오버라이딩

오버라이딩

  • 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언
    → 변수에 대한 오버라이딩은 존재 하지 않음
  • 기본 클래스의 가상 함수를 무력화 시킴
  • 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩됨
    → 어느 클래스에 포함되는 포인터인지는 무관함
  • 실행 시간 다형성을 가짐
  • 오버라이딩의 조건을 만족하면 함수 재정의가 아닌 오버라이딩

오버라이딩의 조건

  1. virtual
  2. 업 캐스팅

오버라이딩의 목적

  • 다형성 실현
    : 기본 클래스의 가상 함수가 파생 클래스에서 구현해야 할 함수 인터페이스를 제공 함으로써 하나의 인터페이스에 대해 서로 다른 모양의 구현이라는 다형성 실현

🍑동적 바인딩

  • 파생 클래스의 객체에 대해 기반 클래스에 대한 포인터로 가상 함수를 호출 하는 경우
    → 파생 클래스에서 재정의한 가상 함수의 호출을 보장받는 선언
  • 나중에 가상 함수를 호출 시 실행 중에 객체 내에 오버라이딩된 가상 함수를 동적으로 찾아 호출함
  • 실행 중에 호출될 함수가 정해짐
    → 실행시간 바인딩, 런타임 바인딩, 늦은 바인딩

C++ 오버라이딩의 특징

1. 오버라이딩의 성공 조건

  • 가상 함수 이름, 매개 변수 타입과 개수, 리턴 타입이 모두 일치

2. virtual 생략

  • virtual 지시어는 상속되므로 오버라이딩 시에 파생 클래스에서 virtual 생략 가능

3. 가상 함수 접근 지정의 자유

🍑오버라이딩과 범위 지정 연산자::

  • 기본 클래스의 가상 함수를 정적 바인딩으로 호출 가능
  • 기본클래스 :: 가상함수()의 형태

🍑가상 소멸자

  • 기본 클래스의 소멸자와 파생 클래스의 소멸자 모두를 실행시키기 위해 사용
  • 동적 바인딩에 의해 파생 클래스의 소멸자가 실행되고 파생 클래스의 소멸자는 자신이 실행된 후 기본 클래스의 소멸자를 호출하도록 컴파일되므로 두 소멸자가 모두 순서대로 실행됨.

🍑오버 로딩, 함수 재정의, 오버라이딩 비교

  • 오버로딩 : 함수 중복 작성
    • 매개 변수의 타입이나 개수가 다른
  • 함수 재정의 : 가상함수가 아닌 기본 클래스의 멤버 함수를 파생 클래스에서 재작성 하여 정적 바인딩으로 처리
    • 이름 매개변수 타입과 개수 리턴타입까지 완벽히 같은 원형으로 작성
  • 오버라이딩 : 기본 클래스의 가상 함수를 파생 클래스에서 재작성하여 동적 바인딩을 유발
    • 이름 매개변수 타입과 개수 리턴타입까지 완벽히 같은 원형으로 작성

🍑가상 함수를 가진 기본 클래스의 목적

가상 함수 오버라이딩

: 파생 클래스마다 다르게 구현하는 다형성

동적 바인딩 실행

: 파생 클래스의 가상 함수 실행

profile
보안 공부하는 대학교 4학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글