programing tip

순수한 가상 함수가 0으로 초기화되는 이유는 무엇입니까?

itbloger 2020. 6. 15. 21:57
반응형

순수한 가상 함수가 0으로 초기화되는 이유는 무엇입니까?


우리는 항상 순수한 가상 함수를 다음과 같이 선언합니다 :

virtual void fun () = 0 ;

즉, 항상 0에 할당됩니다.

내가 이해하는 것은 이것이이 함수의 vtable 항목을 NULL로 초기화하고 여기의 다른 값으로 컴파일 타임 오류가 발생한다는 것입니다. 이 이해가 맞습니까?


그 이유 =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과는 관련이 없지만 그와의 유사성은 니모닉 값을 가질 수 있습니다.


이 뒤에 어떤 의미가 있는지 확실하지 않습니다. 언어의 구문 일뿐입니다.


새로운 예약어는 식별자로 이러한 단어를 사용하는 오래된 프로그램을 깨뜨리기 때문에 C ++은 항상 새로운 키워드를 소개하지 않았습니다. 그것은 종종 오래된 코드를 가능한 한 존중하는 언어의 장점 중 하나로 여겨집니다.

= 0구문은 vtable 항목을로 설정하는 것과 유사하므로 실제로 선택되었을 수 0있지만 이는 순전히 상징입니다. 대부분의 컴파일러는 이러한 vtable 항목을 프로그램을 중단하기 전에 오류를 발생시키는 스텁에 할당합니다.


C ++에는 순수한 가상 함수와 일반 가상 함수 선언을 구별 할 수있는 방법이 있어야합니다. 그들은 = 0구문 을 사용하기로 결정했습니다 . 그들은 순수한 키워드를 추가함으로써 쉽게 같은 일을 할 수있었습니다. 그러나 C ++은 새로운 키워드를 추가하는 것을 매우 싫어하며 다른 메커니즘을 사용하여 기능을 도입하는 것을 선호합니다.


이 경우 "초기화"또는 "할당"이 없습니다. = 0구성된 단지 구문 구조에서 =0중 하나를 초기화 또는 할당에 전혀 관계가없는 토큰.

"vtable"의 실제 값과 관련이 없습니다. C ++ 언어에는 "vtable"또는 이와 유사한 개념이 없습니다. 다양한 "vtables"는 특정 구현의 세부 사항에 지나지 않습니다.


재미있는 구문에 대한 타당성이 동일한 것을 수행하는 다른 키워드를 도입하는 것보다 (표준 수용 측면에서) 더 쉽다는 것을 읽은 것을 기억합니다.

나는 이것이 Bjarne Stroustrup의 C ++의 디자인과 진화에서 언급되었다고 생각합니다.


나는 이것이 C ++ 문법의 일부라고 가정합니다. 컴파일러가 주어진 특정 이진 형식에 대해 실제로 이것을 구현하는 방법에는 제한이 없다고 생각합니다. 당신은 아마 초기 C ++ 컴파일러에 적합했다고 가정합니다.


= 0선언 순수 가상 함수를 .

이해해야 할 것은 이것이이 함수의 vtable 항목을 NULL로 초기화하고 여기의 다른 값으로 컴파일 타임 오류가 발생한다는 것입니다

나는 그것이 사실이라고 생각하지 않습니다. 그것은 단지 특별한 문법입니다. vtable은 구현에 따라 정의됩니다. 순수한 멤버에 대한 vtable 항목은 생성시 실제로 제로화되어야한다고 말합니다 (대부분의 컴파일러는 vtables를 비슷하게 처리하지만).


"실제 기능을 가리 키도록 vtable 항목을 초기화 할 수도 있습니다"

 virtual void fun()
 {
     //dostuff()
 }

vtable 항목을 아무데도 가리 키지 않거나 (0) 함수로 정의 할 수 있다는 것이 직관적입니다. 고유 한 값을 지정하면 함수 대신 가비지를 가리킬 수 있습니다. 그러나 이것이 "= 0"이 허용되고 "= 1"이 허용되지 않는 이유입니다. "= 0"이 왜 사용되는지에 대해 Neil Butterworth가 옳다고 생각합니다

참고 URL : https://stackoverflow.com/questions/2156634/why-is-a-pure-virtual-function-initialized-by-0

반응형