우리는 항상 순수한 가상 함수를 다음과 같이 선언합니다 :
virtual void fun () = 0 ;
즉, 항상 0에 할당됩니다.
내가 이해하는 것은 이것이이 함수의 vtable 항목을 NULL로 초기화하고 여기의 다른 값으로 컴파일 타임 오류가 발생한다는 것입니다. 이 이해가 맞습니까?
virtual void func() = 100;
우리는 항상 순수한 가상 함수를 다음과 같이 선언합니다 :
virtual void fun () = 0 ;
즉, 항상 0에 할당됩니다.
내가 이해하는 것은 이것이이 함수의 vtable 항목을 NULL로 초기화하고 여기의 다른 값으로 컴파일 타임 오류가 발생한다는 것입니다. 이 이해가 맞습니까?
virtual void func() = 100;
답변:
그 이유 =0
는 Bjarne Stroustrup이 기능이 구현 될 당시 C ++ 커뮤니티를지나 "순수한"과 같은 다른 키워드를 얻을 수 있다고 생각하지 않았기 때문입니다. 이것은 그의 책, C ++의 디자인 및 진화 , 섹션 13.2.3에서 설명됩니다 :
궁금한 = 0 구문이 선택되었습니다. 당시에 새 키워드를받을 가능성이 없었기 때문입니다.
또한 이것은 vtable 항목을 NULL로 설정할 필요가 없으며 순수 가상 기능을 구현하는 가장 좋은 방법은 아니라고 명시 적으로 언급합니다.
C ++의 디자인에 대한 대부분의 "왜"질문과 마찬가지로 Bjarne Stroustrup 1 의 C ++의 디자인과 진화 는 다음과 같습니다.
흥미로운
=0
키워드는 새로운 키워드를 도입 할 수있는 확실한 대안pure
이나 새로운 키워드abstract
를받을 가능성이 없었기 때문에 선택되었습니다. 내가 제안했다면pure
, 릴리스 2.0은 추상 클래스없이 제공되었을 것입니다. 더 좋은 구문과 추상 클래스 중 하나를 선택하면 추상 클래스를 선택했습니다. 지연을 위험에 빠뜨리고 특정 싸움을 벌이는 대신pure
, 0을 사용하는 전통 C 및 C ++ 규칙을 사용하여 "없음"을 나타냅니다.=0
기능 체 함수 포인터 벡터로서 구현되는 가상 함수 세트 (단순하지만, 일반적으로 적절한) 볼과 같은 기능을위한 초기화 것이 내보기 구문 맞는다. [...]
1 §13.2.3 구문
C ++ 표준의 섹션 9.2는 클래스 멤버에 대한 구문을 제공합니다. 다음과 같은 프로덕션이 포함됩니다.
pure-specifier:
= 0
가치에 특별한 것은 없습니다. "= 0"은 "이 함수는 순수한 가상입니다."라는 구문입니다. 초기화 또는 널 포인터 또는 숫자 값 0과는 관련이 없지만 그와의 유사성은 니모닉 값을 가질 수 있습니다.
= 0
. 함수 본문이 {}로 래핑 된 이유를 묻는 것과 같습니다. C ++ 구문이 정의한 것이기 때문입니다.
새로운 예약어는 식별자로 이러한 단어를 사용하는 오래된 프로그램을 깨뜨리기 때문에 C ++은 항상 새로운 키워드를 소개하지 않았습니다. 그것은 종종 오래된 코드를 가능한 한 존중하는 언어의 장점 중 하나로 여겨집니다.
이 = 0
구문은 vtable 항목을로 설정하는 것과 유사하므로 실제로 선택되었을 수 0
있지만 이는 순전히 상징입니다. 대부분의 컴파일러는 이러한 vtable 항목을 프로그램을 중단하기 전에 오류를 발생시키는 스텁에 할당합니다.
pure
키워드는 내 책에서 훌륭했을 것입니다. 어쨌든, 근거를 이해하는 것이 좋습니다.
#define pure = 0
.
는 = 0
선언 순수 가상 함수를 .
이해해야 할 것은 이것이이 함수의 vtable 항목을 NULL로 초기화하고 여기의 다른 값으로 컴파일 타임 오류가 발생한다는 것입니다
나는 그것이 사실이라고 생각하지 않습니다. 그것은 단지 특별한 문법입니다. vtable은 구현 정의되어 있습니다. 순수한 멤버에 대한 vtable 항목은 생성시 실제로 제로화되어야한다고 말합니다 (대부분의 컴파일러는 vtables를 비슷하게 처리하지만).
= 0
전체 클래스를 추상화하고 순수한 함수에 대한 가상 호출을 금지하는 것입니다. 비가 상 호출은 여전히 괜찮습니다. 정의 (제공 한 경우)가 사용될 때입니다.
__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/... 대신 자료의 :: F ()
"실제 기능을 가리 키도록 vtable 항목을 초기화 할 수도 있습니다"
virtual void fun()
{
//dostuff()
}
vtable 항목을 아무데도 가리 키지 않거나 (0) 함수로 정의 할 수 있다는 것이 직관적입니다. 고유 한 값을 지정하면 함수 대신 가비지를 가리킬 수 있습니다. 그러나 이것이 "= 0"이 허용되고 "= 1"이 허용되지 않는 이유입니다. "= 0"이 왜 사용되는지에 대해 Neil Butterworth가 옳다고 생각합니다