2011-01-06 4 views
4

C++ 사양에 대한 필자의 지식에 따르면 가상 멤버가있는 클래스의 vtable은 비 순수 비선형 가상 메서드의 첫 번째 정의에 배치됩니다. 컴파일러는 모든 순수 가상 메소드 (예 : 인터페이스)를 가진 클래스에서 상속받은 클래스를 어떻게 처리합니까? 이 경우 vtable은 어디에 배치됩니까?완전히 순수 가상 클래스의 Vtable 배치

+3

C++ 사양 자체에는 vtable에 대한 설명이 없습니다. –

+1

무거운 구현 세부 사항. MSVC++에는 이러한 vtable을 표시하지 않으려면 __declspec (novtable)이 있습니다. 그리고 동일한 작업을 수행하는 비표준 __interface 키워드. –

답변

5

vtable은 구현 된 가상 메소드의 주소를 저장합니다. 클래스의 모든 메소드가 순수 가상이고 구현 된 메소드가없는 경우 vtable을 생성 할 필요가 없습니다.

클래스에서 파생되고 메소드를 구현하지 않으면 클래스를 많이 사용할 수 없습니다. 구현 된 가상 메서드가있는 각 클래스에는 모든 가상 메서드에 대한 주소가 포함 된 자체 vtable이 있습니다. 어떤 식 으로든 기본 클래스의 vtable을 참조하지는 않습니다. 주소가 중복됩니다. 따라서 다른 클래스에서 상속받은 클래스가 있으면 해당 클래스는 자체 vtable 만 사용합니다. 기본 클래스의 vtable은 신경 쓰지 않습니다. 이 vtable은 존재할 필요가 없습니다.

C++ 사양 자체는 vtable에 대해서는 아무 것도 말하지 않습니다. 그들은 단순히 공통적 인 컴파일러 동작입니다.

+0

흥미 롭습니다. 중복 테이블을 가지고 있으면 일종의 정의 규칙을 위반했을 것이라고 생각했을 것입니다. – tgoodhart

+0

테이블이 중복되지 않습니다. 새 테이블은 가상 메소드가 해당 클래스에 의해 구현 된 경우에만 생성됩니다. 이 구현에 대한 포인터를 포함하는 고유 한 vtable을 만듭니다. 테이블에는 변경되지 않은 가상 메소드에 대한 중복 주소가 포함됩니다. – fuzzyTew

+1

클래스의 모든 메서드가 순수 가상 인 경우 구현되지 않습니다. 이것은 사실이 아닙니다. C++에서 순수 가상은 구현이 없다는 것을 의미하지는 않습니다. –

2

내 제한된 지식 : 인스턴스가있을 때까지 vtable이 필요하지 않습니다.

+0

인스턴스가 무엇입니까? 컴파일러는 하나의 TU를 컴파일 할 때 순수 가상 함수가 다른 TU에서 구현을 정의하는지 여부를 알지 못합니다. 컴파일러 구현자는이를 처리하는 방법을 결정할 수 있으며 정의되지 않은 순수 가상 함수에 대한 불법 호출을보고하기 위해 vtable을 만들고 오류 함수에 대한 포인터를 설정하는 합리적인 해결책이 될 수 있습니다. –

3

C++ 표준은 vtable 배치 또는 v- 테이블의 존재 여부에 대해서는 지정하지 않습니다. 단지 동작을 지정하고 v 테이블은 가장 직접적인 구현이므로 널리 사용됩니다.

사실상 추상 테이블에 대해 v 테이블이 존재하는 이유 중 하나는 오브젝트의 동적 유형이 추상 클래스 인 경우 생성 및 삭제 중 사용하기위한 것입니다.

순수 가상 함수 만있는 클래스에는 생성자가 없을 수 있습니다 (생성자는 가상 일 수 없으므로). 그러나 소멸자는 확실히 가상 일 수 있습니다.

클래스에는 여전히 구현시 pure virtual destructor이있을 수 있으며 v 테이블 (또는 이와 동등한 구현 세부 사항)이 필요합니다.

그러나 순수 가상 함수의 구현은 드물고 인터페이스를 정의 할 때 수행되지 않습니다.

관련 문제