ISO C ++ 표준은 순수 가상이 아닌 클래스의 모든 가상 메서드를 정의해야한다고 지정합니다.
간단히 말해서 규칙은 다음과 같습니다.
파생 클래스가 Base 클래스 가상 메서드를 재정의하면 정의도 제공해야합니다. 그렇지 않으면 Base 클래스가 해당 메서드의 정의를 제공해야합니다.
코드 예제의 위 규칙에 따라 virtual void bar();Base 클래스의 정의가 필요합니다.
참고:
C ++ 03 표준 : 10.3 가상 함수 [class.virtual]
클래스에서 선언 된 가상 함수는 정의되거나 해당 클래스에서 순수 (10.4)로 선언되거나 둘 다로 선언됩니다. 그러나 진단은 필요하지 않습니다 (3.2).
따라서 함수를 순수 가상으로 만들거나 정의를 제공해야합니다.
GCC의 자주 묻는 질문 doccuments뿐만 아니라 그것을 :
ISO C ++ 표준은 순수 가상이 아닌 클래스의 모든 가상 메서드를 정의해야하지만이 규칙 위반에 대한 진단은 필요하지 않음을 지정합니다 [class.virtual]/8. 이 가정을 기반으로 GCC는 암시 적으로 정의 된 생성자, 할당 연산자, 소멸자 및 첫 번째 비 인라인 메서드를 정의하는 번역 단위의 클래스 가상 테이블 만 내 보냅니다.
따라서이 특정 메서드를 정의하지 않으면 링커가 관련성이없는 기호에 대한 정의가 부족하다고 불평 할 수 있습니다. 안타깝게도이 오류 메시지를 개선하려면 링커를 변경해야 할 수 있으며 항상 그렇게 할 수있는 것은 아닙니다.
해결책은 순수하지 않은 모든 가상 메소드가 정의되도록하는 것입니다. 소멸자는 pure-virtual로 선언 된 경우에도 정의되어야합니다 [class.dtor]/7.