일반 함수는 주소만으로 호출 할 수 있으므로 일반 함수를 가리키는 포인터는 단지 주소입니다.
비 가상 함수는 주소 (물론 컴파일러가 사용하는 메커니즘에 의해 전달 된 this
포인터)를 사용하여 호출 할 수도 있으므로 비 가상 함수에 대한 포인터는 단지 주소 일 수 있습니다 .
가상 함수는 컴파일러 관련 메커니즘 (일반적으로 개체의 알려진 오프셋에서 vtable로, 함수의 주소는 테이블로 인덱싱 됨)에서 찾아야하며 가상의 포인터 함수는 객체의 실제 유형에 따라 호출 할 실제 함수가 무엇인지 결정하는 데 필요한 정보를 포함해야합니다.
그러나 구성원 함수에 대한 포인터는 가상 함수와 가상 함수를 모두 처리 할 수 있어야하므로 둘 모두에 적합한 메커니즘을위한 충분한 공간이있을 것이며 런타임 호출은 저장된 데이터를 확인하여 무엇을 해야할지.
일부 컴파일러는 확실한 방법으로 확실하게 을 지정하지 않으면 포인터를 가상 함수에 대한 포인터를 포인터에 저장하면 컴파일러에서 더 작은 포인터 표현을 생성하고, 나중에 약속을 어기면 곤경에 처하게됩니다.
&
이 필요한 이유는 필수입니다. 마이크로 소프트의 초기 C++ 컴파일러는 &
을 필요로하지 않았으며 (클래스 이름을 필요로하지 않았으며, 생략했다면 현재 객체 클래스의 멤버 함수에 대한 포인터를 얻을 수 있습니다); 그들은 규칙을 없애라는 제안에 관해 이야기했지만 어디에도 없었습니다.
구성원 함수에 대한 포인터를 사용하면 일반적으로 잘 끝나지 않습니다. –
자세한 내용을 확인하십시오. – seanmcl
표준에 그렇게 쓰여 있기 때문에'&'를 사용해야합니다. –