강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

이준표님의 프로필 이미지
이준표

작성한 질문수

C개발자를 위한 최소한의 C++

가상 함수 작동원리 (동적 바인딩, 가상 함수 테이블)

파생클래스에서 virtual함수를 선언에 대한 질문입니다.

해결된 질문

작성

·

98

·

수정됨

0

강의를 보고 파생클래스에서 새로운 virtual함수를 선언 했을 때 vtable에 추가가 되면 어떻게 될까 하고 확인해보니 기본 클래스에서 선언한 virtual함수만 vtable에 추가 되어 있는 것을 확인할 수 있었습니다.

그렇다면 파생클래스에서 새롭게 선언된 virtula함수는 어디에 등록이 되어 있는건가요? vtable은 하나만 존재하는 걸로 아는데 새로운 vtable이라도 생성되는건가요?? 궁금합니다 ㅠㅠ

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

좋은 세상이네요. 인프런 AI의 답변을 참고하시기 바랍니다.

간단히만 요약하면 vtable은 각 클래스가 개별적으로 갖는 형태가 될 수 있으며 기본 클래스에 존재하는 가상 함수를 파생 형식에서 재정의 할 경우 기본 클래스 vtable에 대상 함수의 메모리 주소가 파생 클래스 함수 주소로 치환됩니다. 그리고 그 시점은 파생 클래스 생성자가 호출될 때 입니다. 참고하시기 바랍니다. 😄

이준표님의 프로필 이미지
이준표
질문자

답변 감사합니다!

이준표님의 프로필 이미지
이준표
질문자

조사식으로 확인할 때 함수가 추가되어 있지 않아서 몰랐는데 vtable에 배열의 크기가 늘어난 걸로 확인이 되네요!

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

와우~! 이런 디테일한 실습을 병행하고 계시는 군요. 멋집니다. 잘 하고 계신겁니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. 이준표님!

파생 클래스에서 새로운 virtual 함수를 선언할 때 vtable 내의 구조와 관련하여 몇 가지 중요한 개념을 설명드리겠습니다.

  • 기본 클래스와 파생 클래스의 vtable:

    • 일반적으로 클래스가 virtual 함수를 가지게 되면, 해당 클래스에는 가상 함수 테이블(vtable)이 생성됩니다. 기본 클래스의 vtable에는 기본 클래스의 virtual 함수들이 포함됩니다.
    • 파생 클래스에서는 상속받은 virtual 함수와 새롭게 추가된 virtual 함수에 대한 정보를 가지고 있습니다. 파생 클래스의 vtable은 일반적으로 기본 클래스의 vtable을 상속하거나 확장하여 필요에 따라 자신만의 vtable을 생성합니다.
  • 파생 클래스의 virtual 함수:

    • 파생 클래스가 새로운 virtual 함수를 선언하면, 해당 함수는 파생 클래스의 vtable에 추가됩니다. 기본 클래스의 vtable에 추가되는 것이 아니라, 파생 클래스의 vtable 내에 참조됩니다.
    • 실제로 vtable은 클래스의 인스턴스에 따라 다르게 존재할 수 있지만, 각 객체는 자신의 클래스에 맞는 vtable을 참조합니다. 따라서 파생 클래스는 기본 클래스와 독립적인 vtable을 가질 수 있습니다.
  • vtable의 생성과 사용:

    • vtable은 클래스 계층 구조에서 각 클래스의 가상 함수를 처리하기 위해 효과적으로 사용됩니다. 클래스가 여러 virtual 함수를 상속받게 되면, 각 클래스는 자신의 vtable을 가지며, 임의의 객체가 해당 함수 호출에 맞는 적절한 메소드를 찾을 수 있도록 합니다.

더 깊이 있는 이해를 위해 기존 유사한 질문을 찾아봤습니다. 관련된 질문 링크를 참고하시면 더욱 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이준표님의 프로필 이미지
이준표

작성한 질문수

질문하기