c++ static binding /

c++ static binding /

작성일 2021.11.14댓글 1건
    게시물 수정 , 삭제는 로그인 필요

c++ static binding / dynamic binding 차이가 뭐고 virtual 는 무슨 상관관계가 있어요?


#c++ static #c++ static 함수 #c++ static 변수 #c++ static_cast #c++ static class #c++ static 함수 사용 이유 #c++ static const #c++ static 멤버 함수 #c++ static 전역변수 #c++ static_assert

profile_image 익명 작성일 -

static : 정적

dynamic : 동적

정적은 컴파일 타임에 일어나는 것을 의미하고

동적은 런 타임에 일어나는 것을 의미합니다.

그러니까 각각

컴파일 타임에 일어나는 바인딩,

런 타임에 일어나는 바인딩인 것이죠.

부모 클래스 Base와

자식 클래스 Derived가 있고

둘이 오버라이딩 된 메서드 func를 갖고 있다고 합시다.

C++의 상속 관계에서

다운캐스팅, 업캐스팅이 가능합니다.

다운캐스팅은 부모 클래스 -> 자식 클래스

업캐스팅은 자식 클래스 -> 부모 클래스

Base* Ptr = new Derived;

이렇게 되면 Derived 객체를 Base*가 가리키고 있으므로 업캐스팅인 겁니다.

여기서

Ptr->func();

를 하게 되면

Base::func

Derived::func

중 뭐가 호출될까요?

Base::func가 호출됩니다.

왜냐하면

Base*는 Base 타입, Derived 타입의 객체를 가리킬 수 있는데

이 때문에 컴파일러는 Ptr이 가리키는 객체의 실 타입이 무엇인지 알 수 없는 것이죠.

이때는 그냥 알 거 없이 Base::func를 실행합니다.

이게 정적 바인딩에요. 컴파일 타임에 Base쪽 메서드를 실행하겠다고 결정하는 것.

그런데 문제는 Derived에서 오버라이딩 됐다면 대다수의 경우는 무조건 Derived::func를 실행해야 한다는 겁니다.

그런데 아까 컴파일러는 Ptr이 가리키는 실 타입을 모른다고 했죠?(컴파일 타임엔 알 수가 없다 !)

따라서 런 타임에 동적으로 바인딩을 해야해요.

그 방법이 virtual 키워드를 붙여 가상 함수로 선언하는 것입니다.

클래스가 가상 함수를 하나라도 가지고 있으면 그 클래스에는 '가상 함수 테이블'이 생성됩니다. (vtable, vftable)

이 가상 함수 테이블에는 실행할 함수(Derived::func)의 주소를 가지고 있습니다.

그 주소를 참조해서 동적으로 바인딩을 하는 것이죠.

그리고 클래스 필드에 가상 함수 테이블이 위치한 주소를 알기 위한

내부적으로 포인터가 하나 추가됩니다.

자바 언어가 뭔가여

... 객체 지향 언어인 C++ 언어의 객체 지향적인 장점을 살리면서 분산 환경을... 그러나 정적인 연결(static binding)을 취하는 자바는 컴파일시에 객체에 대한 참조가...

java 에 대하여 내공 50 겁니다.

... 따라서 소프트웨어나 프로그렘을 생성하실경우에는 c++언어를 기반으로 만들어진... 그러나 정적인 연결(static binding)을 취하는 자바는 컴파일시에 객체에 대한 참조가...

클래스 메크로 멤버 질문

C++의 코드에서 클래스 내부에 멤버 중에 핑크색으로 된 부분이... { \ static const ADO_BINDING_ENTRY rgADOBindingEntries[] = { #define ADO_FIXED...

static 멤버 함수를 오버라이딩 받을 수...

... <2> 제가 보고 있는 책에 static 멤버 함수를 오버라이딩 받을... >> virtual 키워드를 통해서 얻는 것은 C++의 다형성입니다. 또 다르게 말하면 동적바인딩(Dynamic Binding)을...

자바가 뭐예요???

... 객체 지향 언어인 C++ 언어의 객체 지향적인 장점을 살리면서 분산 환경을... 그러나 정적인 연결(static binding)을 취하는 자바는 컴파일시에 객체에 대한 참조가...

MFC로 SURF알고리즘 구현

... C,C++ 코딩을 하시려면 직접 OpenCV를 빌드하셔야... BUILD_opencv_js_binding_generator : 체크 해제 합니다.... BUILD_WIH_STATIC_CRT : 체크 해제 합니다. BUILD_opencv...

자바가 뭐죠?

... 객체 지향 언어인 C++ 언어의 객체 지향적인 장점을 살리면서 분산 환경을... 그러나 정적인 연결(static binding)을 취하는 자바는 컴파일시에 객체에 대한 참조가...