C++ 사양에 대한 필자의 지식에 따르면 가상 멤버가있는 클래스의 vtable은 비 순수 비선형 가상 메서드의 첫 번째 정의에 배치됩니다. 컴파일러는 모든 순수 가상 메소드 (예 : 인터페이스)를 가진 클래스에서 상속받은 클래스를 어떻게 처리합니까? 이 경우 vtable은 어디에 배치됩니까?완전히 순수 가상 클래스의 Vtable 배치
답변
vtable은 구현 된 가상 메소드의 주소를 저장합니다. 클래스의 모든 메소드가 순수 가상이고 구현 된 메소드가없는 경우 vtable을 생성 할 필요가 없습니다.
클래스에서 파생되고 메소드를 구현하지 않으면 클래스를 많이 사용할 수 없습니다. 구현 된 가상 메서드가있는 각 클래스에는 모든 가상 메서드에 대한 주소가 포함 된 자체 vtable이 있습니다. 어떤 식 으로든 기본 클래스의 vtable을 참조하지는 않습니다. 주소가 중복됩니다. 따라서 다른 클래스에서 상속받은 클래스가 있으면 해당 클래스는 자체 vtable 만 사용합니다. 기본 클래스의 vtable은 신경 쓰지 않습니다. 이 vtable은 존재할 필요가 없습니다.
C++ 사양 자체는 vtable에 대해서는 아무 것도 말하지 않습니다. 그들은 단순히 공통적 인 컴파일러 동작입니다.
흥미 롭습니다. 중복 테이블을 가지고 있으면 일종의 정의 규칙을 위반했을 것이라고 생각했을 것입니다. – tgoodhart
테이블이 중복되지 않습니다. 새 테이블은 가상 메소드가 해당 클래스에 의해 구현 된 경우에만 생성됩니다. 이 구현에 대한 포인터를 포함하는 고유 한 vtable을 만듭니다. 테이블에는 변경되지 않은 가상 메소드에 대한 중복 주소가 포함됩니다. – fuzzyTew
클래스의 모든 메서드가 순수 가상 인 경우 구현되지 않습니다.
이것은 사실이 아닙니다. C++에서 순수 가상은 구현이 없다는 것을 의미하지는 않습니다. –
내 제한된 지식 : 인스턴스가있을 때까지 vtable이 필요하지 않습니다.
인스턴스가 무엇입니까? 컴파일러는 하나의 TU를 컴파일 할 때 순수 가상 함수가 다른 TU에서 구현을 정의하는지 여부를 알지 못합니다. 컴파일러 구현자는이를 처리하는 방법을 결정할 수 있으며 정의되지 않은 순수 가상 함수에 대한 불법 호출을보고하기 위해 vtable을 만들고 오류 함수에 대한 포인터를 설정하는 합리적인 해결책이 될 수 있습니다. –
C++ 표준은 vtable 배치 또는 v- 테이블의 존재 여부에 대해서는 지정하지 않습니다. 단지 동작을 지정하고 v 테이블은 가장 직접적인 구현이므로 널리 사용됩니다.
사실상 추상 테이블에 대해 v 테이블이 존재하는 이유 중 하나는 오브젝트의 동적 유형이 추상 클래스 인 경우 생성 및 삭제 중 사용하기위한 것입니다.
순수 가상 함수 만있는 클래스에는 생성자가 없을 수 있습니다 (생성자는 가상 일 수 없으므로). 그러나 소멸자는 확실히 가상 일 수 있습니다.
클래스에는 여전히 구현시 pure virtual destructor이있을 수 있으며 v 테이블 (또는 이와 동등한 구현 세부 사항)이 필요합니다.
그러나 순수 가상 함수의 구현은 드물고 인터페이스를 정의 할 때 수행되지 않습니다.
- 1. 순수 가상 함수 호출
- 2. 순수 가상 함수가
- 3. 인터페이스의 순수 가상 소멸자
- 4. 순수 가상 메서드
- 5. 는 순수 가상 보호 특성을
- 6. 가상 함수와 순수 가상 함수의 차이점은 무엇입니까?
- 7. 순수 가상 메서드없이 클래스 추상화하기
- 8. 순수 가상 소멸자에 대한 질문
- 9. C++의 순수 가상 함수에 관한 질문?
- 10. C++ : 순수 가상 멤버 변수를 재정의 하시겠습니까?
- 11. 순수 가상 함수를 "삭제"하는 방법이 있습니까?
- 12. 가상 클래스의 추상 메서드
- 13. 배치 파일이 완전히 실행되지 않음
- 14. vtable 및 MSIL
- 15. vtable 오류입니다. "vtable for ETRun"에서 참조 된 곳 :
- 16. 클래스의 메서드 배치
- 17. 바디가있는 순수 가상 함수의 사용 사례는 무엇입니까?
- 18. C++ map.clear() 순수 가상 메서드 런타임 오류
- 19. C++에서 순수 가상 함수를 구현하는 방법
- 20. 순수 가상 함수 및 추상 클래스
- 21. 순수 가상 함수는 어디에서 C++에 있습니까?
- 22. 사용되지 않는 순수 가상 메서드 구현이 누락되면 연결이 실패합니다.
- 23. VTable 생성 안 함
- 24. C++ 상속/VTable 관련 질문
- 25. 순수 세분화
- 26. GAC에 배치 된 어셈블리가 완전히 신뢰합니까?
- 27. 완전히 절대 배치 된 레이아웃이 공백으로 표시됩니다.
- 28. 불즈 아이 코드 범위가 상속 된 클래스의 순수 가상 함수를 추적하지 않는 이유는 무엇입니까?
- 29. GCC 3.x 및 4.x의 C++ 객체에서 VTable 레이아웃 및 VTable 포인터 위치는 무엇입니까?
- 30. C++ d3d 후킹 - COM vtable
C++ 사양 자체에는 vtable에 대한 설명이 없습니다. –
무거운 구현 세부 사항. MSVC++에는 이러한 vtable을 표시하지 않으려면 __declspec (novtable)이 있습니다. 그리고 동일한 작업을 수행하는 비표준 __interface 키워드. –