2010-04-17 5 views
1

동적 바인딩은 스택에있는 개체와 함께 발생합니까? 예동적 비딩은 C++에서 힙의 객체에서만 발생합니까?

F 용

()는

int main(){ 

    Derived d1; 
    Based *b= new Derived(); 

    d1.f(); 
    b->f(); 
} 
+0

'd1.f()'가 정적으로 디스패치 될 수 있음에 유의하십시오. 그 이유는 컴파일러가'd1'의 타입을 알고 있기 때문에 동적 디스패치를 ​​최적화 할 수 있기 때문입니다. –

+0

b-> f()도 정적으로 디스패치 할 수 있습니다. 왜냐하면 컴파일러가 정확한 유형을 다시 알기 때문에 호출이 가상 디스패치로 시작되고 컴파일 타임에 정확한 함수를 결정하는 것이 최적화이기 때문입니다. 포인터와 참조 만 다형성을 가지며, 로컬 객체의 멤버 함수 호출은 항상 정적입니다. 그리고 다형성 호출은 동적 바인딩과 다른 v-table 바인딩을 사용합니다. –

답변

6

가상 함수 모두 스택과 힙 개체 일 가상 기본 기능 모두 유도된다. 다음을 시도해보십시오.

#include <iostream> 

class base 
{ 
public: 
    virtual void doit() 
    { 
     std::cout << "base::doit" << std::endl; 
    } 
}; 

class derived : public base 
{ 
public: 
    virtual void doit() 
    { 
     std::cout << "derived::doit" << std::endl; 
    } 
}; 

void invokevirtual(base &b) 
{ 
    b.doit(); 
} 

int main() 
{ 
    derived d; 
    invokevirtual(d); 
} 
+0

출력은 무엇입니까? 지금 컴파일러가 없습니다. 나는 볼 수 없다. 출력이 "derived :: doit"인 경우 동적 바인딩을 의미합니까? – skydoor

+0

@skydoor - 가상 함수는 할당 된 위치에 관계없이 모든 객체에 대해 작동하기 때문에 출력은 "derived :: doit"입니다. –

0

예.

짧은 답변을 드려 죄송합니다.하지만 무슨 일이 일어나고 있는지 알고있는 것 같고 확인이 필요합니다. 맞습니까?

관련 문제