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