달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2012. 9. 27. 00:58

c++ quiz3 c++2012. 9. 27. 00:58


using namespace std;


class B{

public:

    void mf(){ cout << "B " << endl;}

    virtual void vf(){ cout << "VB " << endl;}

};


class D: public B{

public:

    void mf(){ cout << "D "<< endl;}

    virtual void vf(){ cout << "VD " << endl;}

};


int main(int argc, char **argv)

{

    D x;

    B* b = &x;

    b->mf();


    D* d = &x;

    d->mf();



    b->vf();

    d->vf();



    return 0;

}


answer:

B
D
VD
VD

이전에 배웠던 것에서, 클래스를 상속 받고 오버로딩하게 된다면 Base클래스의 함수는 가려지게된다.
하지만, 만약 저와 같이 호출한다면 어떻게 될까?

정답은 서로 다르게 동작한다. 비가상 함수는 정적 바인딩이므로, b는 B클래스 타입으로 정의되어 있으므로, B클래스의 mf함수를 호출한다고 결정해버림.

정적바인딩이란 컴파일 레벨에서 결정하는 단계, b변수는 B클래스 타입으로 정의
동적바인딩이란 런타임 레벨에서 결정하는 단계, b에 x의 주소값이 대입되는 순간

가상함수의 경우에는 동적바인딩이어서 두 함수의 결과는 같을 것이다.

'c++' 카테고리의 다른 글

template C++  (0) 2012.09.27
c++ quiz4  (0) 2012.09.27
c++ strategy 패턴  (0) 2012.09.27
Quiz2  (0) 2012.09.26
c++ struct와 class의 차이점...?????  (0) 2012.09.25
:
Posted by НooпeУ


Code Start Code End