정적 바인딩 (early binding, 컴파일 시간):
void greet() { std::cout << "Hello!"; }
동적 바인딩 (late binding, 실행 시간):
class Animal { public: virtual void speak() { std::cout << "Animal"; } }; class Dog : public Animal { public: void speak() override { std::cout << "Woof"; } }; void foo(Animal* a) { a->speak(); } // 동적 바인딩
언제를 사용해야 하는가:
override 키워드의 사용이 가상 함수의 성능을 향상시킬까요?
답변:
아니요, override 키워드는 함수가 가상 기본 함수를 재정의해야 한다는 것을 컴파일러에 명시적으로 알려주기 위해 사용됩니다. 성능이나 함수 호출 방식에 영향을 미치지 않습니다.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // 컴파일러 검증을 위한 것이며, 호출 속도를 변경하지 않음 };
이야기
고부하 거래소 라이브러리에서 팀은 다형성이 필요하지 않을 때에도 거의 모든 작업에 가상 메소드를 사용했습니다. 그 결과 시스템은 예상보다 느리게 작동했으며, 주요 병목 현상은 vtable 조회에 있었습니다.
이야기
확장 가능한 알고리즘 프로젝트에서 직원들은 가상 대신 일반 메소드를 사용했습니다. 나중에 객체를 기본 포인터를 통해 전달할 때 동작이 변경되지 않아 잘못된 계산이 발생함을 알게 되었고, 버그는 인터페이스를 다시 작성하여 해결되었습니다.
이야기
미디어 파일 분석 프로젝트에서 개발자들은 정적 메소드와 가상 메소드를 혼동했습니다. 여러 포맷을 위한 일부 함수에서 가상 함수로 선언하지 않았고, 상속에서 재정의하지 않아 파일 처리 과정이 잘못된 경로로 진행되었고, 결과는 잘못된 캐싱으로 이어졌습니다.