C++ 공부

[C++ Study] 가상상속과 연산자 오버로딩

Client Side 2026. 4. 28. 23:46

고성능 게임 엔진이나 대규모 시스템 개발을 위한 C++의 정수, 가상 상속연산자 오버로딩을 실무적인 시각으로 정리합니다.


1. 가상 상속 (Virtual Inheritance)

교과서적 정의: 다이아몬드 상속 문제의 해결사

다중 상속 체계에서 발생하는 '다이아몬드 문제(Diamond Problem)'를 해결하기 위한 기법입니다. 최하위 자식 클래스 인스턴스 내부에 베이스 클래스의 멤버가 중복 생성되는 것을 방지합니다.

기술 디테일: vbptr (Virtual Base Pointer)

상속 시 virtual 키워드를 사용하면, 컴파일러는 객체 내부에 vbptr을 생성합니다. 이를 통해 최상위 부모 객체의 오프셋을 계산하여 단 하나의 인스턴스만 공유하도록 제어합니다.

실무적 관점 및 모바일 환경 고려사항

  • 메모리 및 성능 오버헤드: vbptr을 통한 간접 참조(Indirection)가 발생하며, 이는 일반 상속보다 미세하게 느립니다.
  • 캐시 효율성: 모바일 환경(Vulkan 등)에서는 메모리 레이아웃의 연속성이 중요합니다. 가상 상속은 캐시 미스 가능성을 높일 수 있습니다.
  • 설계 대안: 현대 아키텍처에서는 다중 상속 대신 컴포넌트 기반 설계(Composition)를 권장합니다.

2. 연산자 오버로딩 (Operator Overloading)

교과서적 정의: 사용자 정의 타입의 연산 규칙

사용자 정의 클래스에서도 +, -, * 등의 연산자를 기본 자료형처럼 직관적으로 사용할 수 있게 재정의하는 기능입니다.

구분 멤버 함수 오버로딩 전역 함수 오버로딩
주체 클래스 내부 정의 클래스 외부 정의
특징 왼쪽 피연산자가 클래스여야 함 피연산자 타입 대칭성 확보 가능
권장 상태 변경 연산 (+= 등) 교환 법칙이 필요한 연산 (f * V)

반드시 '멤버 함수'여야 하는 연산자

C++ 표준에 의해 아래 연산자들은 반드시 멤버 함수로만 오버로딩해야 합니다.

  • 대입 연산자 (=)
  • 함수 호출 연산자 (())
  • 배열 인덱스 연산자 ([])
  • 멤버 접근 연산자 (->)

🔍 Senior's Check-list

  • 가상 상속: 구조적 모호함을 해결해야 하는 최후의 보루로만 사용합니다.
  • 연산자 오버로딩: 가독성에는 좋으나, 의미가 불분명한 오버로딩은 지양합니다.
  • 성능: 불필요한 임시 객체 생성을 막기 위해 복사 생략(Copy Elision)을 고려하십시오.