2013-02-28 2 views
2

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; 
} 
+4

이 경우 예와 일부 컴파일러는 간단한 흐름 분석으로 가상 호출을 최적화 할 수 있지만 일반적으로 다른 번역 단위에있는 함수를 포함하여 어디에서나 'p'를 전달할 수 있으며 'p '가 초기화 된 방법을 알기 위해서. 동일한 번역 단위 내에서도 '* p'의 런타임 유형을 결정하는 것이 문제 해결 완료 (halting-problem-complete) 인 프로그램을 쉽게 작성할 수 있습니다. –

답변

3

이 파생에 대한 함수 호출입니다 : 컴파일러는 함수 호출 여기에 예를 들어, 파생 또는 기본 기능에 있는지 알아 내기 위해 모든 정보를 가지고 있지 않습니다 함수 자체를 컴파일하는 동안 함수 foo?

수 있습니다. 그리고 일부 컴파일러 이 해당 호출을 정적 바인딩으로 변환합니다.

그리고 컴파일러 이 동적 바인딩을 사용해야하는 다른 시나리오가 있습니다.

이 함수에서 어느 foo()이 호출되어야합니까?

void function(Base* p) 
{ 
    p->foo(); 
} 

* 확인할 수 없습니다. 동적 바인딩을 사용해야합니다.

* 편집 : 제공된 정보를 기반으로합니다. :)

+4

글쎄요, 그것은 아마도 프로 시저 간 흐름 분석과 함께 할 수 있습니다 ... 당신이 정말로 원한다면 호출을 가상화하는 방법이 많이 있습니다 :) –