C++

[C++] 가상 함수

programmer-faust 2025. 9. 3. 09:44
  • 순서
    1. 가상 함수
    2. virtual 키워드란?
    3. virtual 키워드 특징
    4. 순수 가상 함수란?
    5. 순수 가상 함수의 특징
    6. 순수 가상 함수 사용 목
    7. 소멸자에 virtual 키워드를 붙이는 경우
  • 가상 함수
    1. 가상 함수는 런타임 다형성을 가능하게 하는 매커니즘으로, virtual 키워드를 사용하여 선언함
    2. 컴파일 타임이 아닌 런타임에 어떤 함수가 호출될지 결정해야 할 때 사용함.
    3. 가상 함수로 인해 자식 클래스에서 함수 오버라이딩으로 새로운 기능을 추가하거나 기능을 변경할 수 있음.
    4. 추가 키워드 
      • override: virtual 키워드로 선언한 함수를 상속받아 사용할 때 상속받은 class에서 override를 붙여 재정의함
      • final: 더이상 virtual로 선언된 함수가 재정의되지 않도록 제한함
      • virtual inheritance: 다이아몬드 상속 문제 해결을 위해 사용됨
  • virtual 키워드란?
    1. C++에서 클래스의 멤버 함수 혹은 소멸자에 붙여 가상 함수로 만들 때 사용하는 키워드임
    2. 런타임 다형성을 지원하기 때문에 객체의 실제 동적 타입에 따라 호출되는 함수가 달라지게 하기 위함.
    3. 가상 함수, 순수 가상 함수, 소멸자에 사용함
    4. virtual이 붙은 함수는 vtable 즉 가상 함수 테이블에 등록됨
    5. 객체는 vptr 가상 함수 테이블 포인터를 숨겨서 가짐
    6. virtual 함수 호출 시 vptr > vtable > 실제 하수 경로를 따라서 호출됨
  • virtual 키워드 특징
    1. 컴파일 타임 결정에서 런타임 결정으로 변경 => virtual이 없는 함수는 정적 바인딩으로 컴파일 시점에 결정되지만 virtual이 있는 함수는 동적 바인딩으로 실행 시점에 객체의 타입을 확인하고 함수 호출
    2. 베이스 클래스에서만 virtual 키워드를 붙이고 자식 class에서 상속받은 함수에 virtual와 override 키워드를 붙이지 않아도 작동함
    3. 외부에서 포인터 또는 참조를 통해 호출할 때만 효과
  • 순수 가상 함수란?
    1. C++에서 구현이 없는 가상 함수를 말함
    2. 문법적으로 virtual type function() = 0; 형식으로 =0을 붙여서 선언함
  • 순수 가상 함수 특징
    1. 인터페이스 강제: 파생 클래스가 반드시 함수를 구현해야함
    2. Base 클래스 자체는 객체 생성 불가함: 순수 가상 함수가 하나라도 있으면 해당 클래스는 추상 클래스가 되고 인스턴스화 불가
    3. 파생 클래스에서 구현
    4. 가상 함수 테이블에도 자리만 차지: Base클래스의 vtable에 엔트리만 있고, 실제 구현은 파생 클래스가 채움
  • 순수 가상 함수의 사용 목적
    1. 추상화와 인터페이스 제공: 공통 기능의 틀만 정의하고, 구체적인 동작은 파생 클래스가 구현하도록 강제하며 다형성을 활용하기 위함.
  • 소멸자에 virtual 키워드를 붙이는  경우
    1. 소멸자에 virtual 키워드를 붙이는 이유는 기본 클래스 포인터로 파생 클래스 객체를 삭제할 때, 파생 클래스의 소멸자가 호출되지 않는 문제를 방지하기 위함.
    2. 기본 클래스가 다형적으로 사용될 가능성이 있어 파생 클래스를 만들고, 기본 클래스 포인터/참조로 객체를 다룰 때.
    3. 성능적인 고려 상황: 소멸자에 virtual이 붙으면 클래스가 vtable을 가지게 되는데 해당 방법에 약간의 메모리/성능 오버헤드가 있지만, 안전성이 중요할 때 오버헤드를 감수하고 사용.
      • 오버헤드를 감수하고 안전성을 위해 virtual을 붙이는 이유는 당장은 파생 클래스 계획이 없어도 차후에 파생 클래스를 만들어 낼 수 있는 가능성이 있을 때.
      • 안전성은 올바른 소멸자의 호출을 뜻함

'C++' 카테고리의 다른 글

[C++] 오버로딩과 오버라이딩  (0) 2025.09.03
[C++] 바인딩  (0) 2025.09.03
[C++]const 키워드  (0) 2025.09.03
[C++]static 키워드  (0) 2025.09.03
[C++] 캐스트 연산자/RTTI  (0) 2025.09.03