C++의 가상 함수 및 가상 테이블에 대해 배우고 있습니다. 그러나 동적 바인딩이 필요한 이유를 이해할 수 없습니다. 캔트 그림을 컴파일하는 이유C++ 다형성 : 형식이 분명 할 때도 정적 바인딩이 불가능합니다.
class Base1 {
public : virtual void foo()
{ cout << " Base foo \n"; }
};
class Base2 {
public : virtual void foo()
{ cout << " Base2 foo \n"; }
};
class derived : public base1, base 2 {
public : virtual void foo()
{ cout << " derived foo \n"; }
}
int main()
{
derived d;
Base2 *p = &d;
p->foo(); // why can't the compiler figure out that this
// is a function call to the derived function
// foo at compile time?
return 0;
}
이 경우 예와 일부 컴파일러는 간단한 흐름 분석으로 가상 호출을 최적화 할 수 있지만 일반적으로 다른 번역 단위에있는 함수를 포함하여 어디에서나 'p'를 전달할 수 있으며 'p '가 초기화 된 방법을 알기 위해서. 동일한 번역 단위 내에서도 '* p'의 런타임 유형을 결정하는 것이 문제 해결 완료 (halting-problem-complete) 인 프로그램을 쉽게 작성할 수 있습니다. –