2016-06-29 9 views
0

컴파일러 우선 순위가 어떻게 작동하는지 이해할 수없는 것 같습니다. 여기 예 코드 : 함수 선택의 C++ 상속 우선 순위

#include <iostream> 
using namespace std; 

class A{ 
public: 
    int f() {return 1;} 
    virtual int g() {return 2;} 
}; 
class B: public A { 
public: 
    int f() {return 3;} 
    virtual int g() {return 4;} 
}; 
class C: public A{ 
public: 
    virtual int g() {return 5;} 
}; 
int main() { 
    A *pa; 
    B b; 
    C c; 

    pa = &b; 
    cout<< pa -> f()<<endl<<pa -> g() << endl; 
    pa = &c; 
    cout<< pa -> f() << endl; cout<< pa -> g() << endl; 

    return 0; 
} 

는 함수 (g() 및 F())마다 호출 될

하는 이유는 무엇입니까?

+2

* 왜 * 코드가 작동하는지 알아낼 수 없다면 프로그램을 실행하여 여기를 찾아보고하십시오. 그러나 먼저 가상 디스패치에 대한 지식을 사용하여 자신을 설명하십시오. – user2079303

+0

나는 그것을 달렸다, 질문은 이유 ... – user107761

+1

당신이 그것을 달렸다면, 분명히 당신은 어떤 기능이 호출되었는지 안다, 그렇지 않습니까? 너는 그렇게 물었다. – user2079303

답변

0

첫 번째 시퀀스에서는 A::f()B::g()을 호출합니다.

두 번째 시퀀스에서는 A::f()C::g()을 호출합니다.

이유는 변수 형식 (A에 대한 포인터)에 따라 컴파일시 비 가상 메서드 인 f()이 해결 되었기 때문입니다. g()A에 가상 메서드로 표시되므로 런타임 해결이 수행되고 항상 실제 인스턴스 (B 또는 C)의 메서드를 호출합니다. 항상 paA*A::f 때문에에 pa 점을 어떤 A::f()를 호출합니다

1

pa->f()가상 없습니다.

  • pa하면 포인트를 B (첫 번째 순서)에, 그것은 B::g()를 호출합니다 :

    pa->g()

    A::g(), B::g() 또는 C::g()A::g가상 때문에 polymorphism을 사용하는 것을 pa 포인트에 따라 호출합니다.
  • paC (두 번째 순서)을 가리키는 경우 C::g()을 호출합니다.
0

함수가 virtual이라고 말하면 정적 바인딩 대신 후기 바인딩을 사용하도록 컴파일러에 지시합니다. 컴파일 시간 동안 A::f()은 정적 바인딩이므로 어떤 메서드 본문을 호출할지 고정되어 있습니다. 한편, A::g()은 컴파일 타임 중에 메소드 본문에 바인딩되지 않습니다. 런타임시 어떤 메소드 본문을 호출할지 (vptr을 사용하여) 결정됩니다.

A *pa; //no matter what object you assign to pa, A::fa() will always be called 
pa = &b; 
pa->f();//calls A::f() 

pa->g();// remember what function body to be called will be decided at runtime. 
//will call B::f() 

pa = &c; 
pa->g(); //will call C::g()