2014-12-10 2 views
2

컴파일러가 특정 조건에서 사용할 메소드의 정확한 구현을 결정할 수 없다는 이야기를 자주 듣습니다. Fox 예제에서 우리는 자식 클래스에서 재정의 된 foo() 메소드를 가진 부모 클래스의 경우 컴파일러가 런타임까지 호출 할 foo()의 구현을하지 않을 시나리오를 상상할 수 있습니다. 따라서 동적 디스패치, vtable 등의 개념이 있습니다.정확히 왜 컴파일러는 런타임까지 변수의 실제 유형을 결정할 수 없습니까?

제 질문은 정확히 입니다.은 호출 할 정확한 구현을 컴파일러에서 결정할 수없는 이유는 무엇입니까? 나는 최근에 그것에 대해 생각하기 위해 멈춰 섰다. 그리고 나는 그것을 정당화하려고 열심히 노력했다. 아마도 나는 정말 실종 된 뭔가가 있습니다 (나는 대답을 듣고 나 자신을 때릴 것입니다). 그것은 외부 상황에 이르기까지입니까? 그렇다면 정확히 어떻게 재생 될까요?

이 문제는 언어에 따른 제한입니까 아니면 더 근본적인 무언가입니까?

+1

을 식의 형태는 항상 컴파일시 알려진. 당신이 확신 할 수없는 것을 보여주는 몇 가지 코드가 있습니까? –

+3

글쎄, 동적 다형성 지원의 전체적인 개념 **은 런타임에 타입 탐지/주입을 가능하게하기 위해 만들어졌습니다. –

+0

첫 번째 문장을 편집했습니다. 아마 이제는 더 명확 해 졌을까요? 그리고 네, 저는 C++로 이것을 보았습니다. 이것은 정적 형식의 기능입니까? – Boon

답변

11

이것에 대해 생각 :

class Base 
{ 
public: 
    virtual void some_virtual_method(){...} 
}; 
class Derived: public Base 
{ 
public:  
    void some_virtual_method() override{...} 
}; 

int choice; 
cin >> choice; // cannot know the value at compile time 

Base* foo; 

if(choice) 
{ 
    foo = new Base; 
} 
else 
{ 
    foo = new Derived; 
} 

foo->some_virtual_method(); 

은 컴파일러 선택은 전적으로 사용자의 입력에 따라로서, 컴파일시에 호출 할 some_virtual_method() 알 수있는 방법이 없습니다. 디스패치는 함수 가상 테이블을 통해 수행되며 런타임에 완료됩니다.

+0

내가 어떻게 생각했는지. 나는 그것에 대해 너무 많이 생각하고 있다고 생각한다. 감사 – Boon

0

컴파일러는 실제로 실행되는 컴퓨터 코드를 준비한다는 점을 제외하고는 런타임과 아무 관련이 없습니다. 개체를 동적으로 생성 및 다형 특성을 가지며,이 전달 될 때까지 기능이 유형은 프로그램에 의해 알려져 있지 수퍼 타입의 파라미터를 취득한다

.

관련 문제