series of articles에서 Dan Saks는 C에서 가능한 가상 함수 구현을 소개합니다. 정적 유형 확인에 더 의존하기 때문에 이것은 the solution of A.-T. Schreinervoid *
포인터 및 동적 유형 확인과 반대되는 다른 접근 방법입니다. 여기 C에서 가상 상속의 예가 정의되지 않은 동작을 이용하고 있습니까?
vptr
S 삭스 '버전
vtable
의 박리없이 다운 일례이다 (편의상, 함수 포인터
struct Base
struct Derived
및 단 부재이다).
요점은 함수 호출 (및 캐스트) Base_get_param((Base *) d)
입니다. 이것은 함수 포인터 int (*get_param)(Derived const *self)
이 int (*get_param)(Base const *self)
으로 "암시 적으로 캐스트"된다는 것을 의미합니까? 호환되지 않는 유형 때문에 여기 (C99 및 C11 표준에 따라) 정의되지 않은 동작을 악용합니까?
나는 GCC 4.8과 clang 3.4 모두에서 적절한 출력을 얻는다. 위의 구현이 손상 될 수있는 상황이 있습니까?
기능 포인터 캐스트 및 호환 유형에 대한 자세한 대답은 here입니다. 그러나이 경우에 대해서는 확실하지 않습니다. 예외가 있지만,
printf("%d\n", Base_get_param((Base *) d));
^^^^^^^^^
엄격한 앨리어싱 규칙이 다른 유형의 포인터를 통해 개체에 액세스하는 정의되지 않은 동작합니다
이것은 정적 상속 vs 동적 상속 인 것으로 보입니다. 이것은 이전에 C에서 본 적이없는 것입니다. 그러나'Base * '를 기대하는 함수에'Derived *'를 전달할 수 없다는 것을 의미합니다. –